A collaborative Pokemon Fire Red experience where players take turns playing for exactly 10 minutes before passing the adventure to the next trainer. Built for kiosk deployment with remote session management and cloud save states.
- Kiosk-Based Architecture: Raspberry Pi kiosks connect to remote backend via secure token-based registration
- Turn-Based Gameplay: Configurable turn duration (default 10 minutes)
- Admin Console: Standalone web application for kiosk activation and save state management
- Game State Tracking: Scrapes Pokemon Fire Red memory for badges, location, party data
- Save Point Restoration: Admin can restore to any previous save state
[Raspberry Pi Kiosk] [Docker Container] [Admin Console]
- Browser (kiosk) <--> - Express (Node.js) <--> - Admin web app
- EmulatorJS - PostgreSQL (metadata) - Kiosk activation
- MinIO (saves + ROMs) - ROM upload
- Save management
Express serves everything directly:
yourdomain.com/→ Kiosk frontendyourdomain.com/admin→ Admin consoleyourdomain.com/api/*→ Backend API
- Docker & Docker Compose
- Pokemon Fire Red ROM (legally obtained)
- GBA BIOS (optional but recommended)
git clone <repository-url>
cd 10mpEdit .env with your settings (database credentials, admin password, domains).
# Build and start the container
npm run docker:build
npm run docker:up
# View logs
npm run docker:logs- Kiosk:
http://localhost - Admin:
http://localhost/admin - Health check:
http://localhost/health
- Open admin (
http://localhost/admin) - Login with your admin password
- In the "ROM Management" section, click "Upload ROM"
- Select your Pokemon Fire Red ROM file (
pokemon-firered.gba) - ROM is stored in MinIO and served to all kiosks
- Open kiosk (
http://localhost) - Kiosk displays a 16-character token
- Open admin (
http://localhost/admin) - Login with your admin password
- Find the kiosk in "Pending Kiosks"
- Click "Activate"
- Kiosk is ready for players!
Edit .env in the project root:
# Database (PostgreSQL)
DB_HOST=postgres
DB_PORT=5432
DB_NAME=tenmp_db
DB_USERNAME=tenmp_user
DB_PASSWORD=your-secure-password
# MinIO (Object Storage)
MINIO_ENDPOINT=minio
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=your-secure-password
MINIO_BUCKET=game-saves
# Admin
ADMIN_PASSWORD=your-admin-passwordnpm run docker:build # Build production Docker image
npm run docker:up # Start container (detached)
npm run docker:down # Stop container
npm run docker:logs # View container logs
npm run docker:clean # Stop and clean up volumes/images
npm run install:all # Install all dependencies locally10mp/
├── frontend/ # React kiosk frontend
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── hooks/ # Custom hooks (useEmulator)
│ │ ├── services/ # API client
│ │ └── utils/ # EmulatorManager
│ └── public/ # Static assets
├── admin/ # Admin console
│ └── src/
│ ├── components/ # Admin dashboard
│ └── services/ # Admin API client
├── backend/ # Node.js/Express API
│ ├── models/ # Sequelize models
│ ├── migrations/ # Database migrations
│ └── services/ # MinIO storage (saves, ROMs)
├── Dockerfile # Multi-stage production build
├── docker-compose.yml # App + PostgreSQL + MinIO
└── .env # Environment configuration
For development without a controller, the keyboard defaults are:
- Arrow Keys: Move
- Z: A Button
- X: B Button
- Enter: Start