Modern Web-Based ROM Library Manager for RetroArch
Bridge your retro gaming collection to RetroArch on Apple TV with automatic metadata, cover art, and seamless synchronization.
- 25+ Gaming Platforms - Support for NES, SNES, PlayStation, Game Boy, and more
- Smart Library Management - Browse and organize your ROM collection with beautiful cover art
- Automatic Metadata - Fetch game information and cover images from IGDB database
- Apple TV Sync - Direct push to RetroArch via WebUI with complete workflow automation
- Save Game Backup - Automatic backup and restore of game saves during sync
- Favorites System - Mark and filter your favorite games
- One-Click Deployment - Single Docker container with frontend, backend, and nginx
- Unraid Compatible - Perfect for Unraid setups with easy configuration
- Modern UI - Pixel-art themed interface built with React
- RESTful API - Clean API for ROM management and RetroArch integration
- SQLite Database - Lightweight, file-based database with volume persistence
- Automatic Cleanup - Smart cleanup of orphaned files
Browse your entire ROM collection with cover art
View detailed game information and metadata
Upload ROMs and automatically fetch metadata
Configure RetroArch Apple TV connection
- Docker installed (Get Docker)
- RetroArch on Apple TV with WebUI enabled
- IGDB API credentials (Get free credentials)
- Add Container in Unraid Docker tab
- Repository:
virus250188/pixelbridge:latest - Network Type: Bridge
- Port:
80→ Host Port:1234(or your preferred port) - Add Volume:
- Container Path:
/app/backend/storage - Host Path:
/mnt/user/appdata/pixelbridge/
- Container Path:
- Add Variables:
STORAGE_PATH=/app/backend/storageRETROARCH_IP=192.168.x.x(your Apple TV IP)IGDB_CLIENT_ID= your client IDIGDB_CLIENT_SECRET= your client secret
- Apply and start!
See UNRAID_SETUP.md for detailed instructions.
docker run -d \
--name pixelbridge \
--restart unless-stopped \
-p 80:80 \
-v /path/to/storage:/app/backend/storage \
-e STORAGE_PATH=/app/backend/storage \
-e RETROARCH_IP=192.168.1.100 \
-e IGDB_CLIENT_ID=your_client_id \
-e IGDB_CLIENT_SECRET=your_client_secret \
virus250188/pixelbridge:latestThen open http://localhost (or http://your-server-ip:port) in your browser.
Create a docker-compose.yml:
version: '3.8'
services:
pixelbridge:
image: virus250188/pixelbridge:latest
container_name: pixelbridge
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./storage:/app/backend/storage
environment:
# Storage (only this path is required - all subdirs are auto-created)
- STORAGE_PATH=/app/backend/storage
# RetroArch Apple TV
- RETROARCH_IP=192.168.1.100
- RETROARCH_PORT=80
# IGDB API Credentials (required for metadata)
- IGDB_CLIENT_ID=your_client_id
- IGDB_CLIENT_SECRET=your_client_secret
# Optional Settings
- NODE_ENV=production
- PORT=3000Start the container:
docker-compose up -d| Variable | Description | Example |
|---|---|---|
STORAGE_PATH |
Base storage path (all subdirs auto-created) | /app/backend/storage |
RETROARCH_IP |
RetroArch Apple TV IP address | 192.168.1.100 |
IGDB_CLIENT_ID |
IGDB API Client ID | abc123... |
IGDB_CLIENT_SECRET |
IGDB API Client Secret | xyz789... |
| Variable | Description | Default |
|---|---|---|
NODE_ENV |
Node environment | development |
PORT |
Backend port | 3000 |
RETROARCH_PORT |
RetroArch WebUI port | 80 |
MAX_FILE_SIZE |
Max upload size in bytes | 4294967296 (4GB) |
Note: You only need to set STORAGE_PATH - all subdirectories (database, roms, covers, metadata) are automatically created and derived from it!
- Register a Twitch Developer account: https://dev.twitch.tv/console
- Create a new application
- Copy your Client ID
- Copy your Client Secret
- The access token will be automatically generated by PixelBridge
- Upload via UI: Click "Upload ROM" and select your ROM file
- Direct Copy: Copy ROMs to
/mnt/user/appdata/pixelbridge/roms/PLATFORM/(they'll be auto-detected on restart)
Supported folder structure:
storage/
├── roms/
│ ├── nes/
│ │ └── game.nes
│ ├── snes/
│ │ └── game.sfc
│ └── gba/
│ └── game.gba
└── covers/
├── rom_1_cover.jpg
└── rom_2_cover.jpg
- Select a ROM from your library
- Click "Push to RetroArch"
- PixelBridge will:
- Backup existing save games from Apple TV
- Transfer the ROM to RetroArch
- Restore your save games
- Verify the transfer
Cleanup orphaned files:
curl -X POST http://your-server:port/api/debug/cleanupPreview cleanup (without deleting):
curl http://your-server:port/api/debug/cleanup/previewpixelbridge/
├── backend/ # Node.js Express API
├── frontend/ # React UI
├── nginx.combined.conf # Nginx reverse proxy config
├── Dockerfile.combined # Single-container build
├── entrypoint.sh # Container initialization
├── docker-compose.yml # Docker Compose config (optional)
└── UNRAID_SETUP.md # Unraid-specific instructions
# Build the combined image
docker buildx build --platform linux/amd64,linux/arm64 \
-t virus250188/pixelbridge:latest \
-f Dockerfile.combined . --push# Backend
cd backend
npm install
npm start
# Frontend (separate terminal)
cd frontend
npm install
npm run dev- Ensure
STORAGE_PATH=/app/backend/storageis set in your container environment - Check that the volume is mounted correctly
- Restart the container after adding the environment variable
- Verify volume mount:
/app/backend/storagemust be mounted - Ensure
STORAGE_PATH=/app/backend/storageenvironment variable is set
- ROMs must be in platform-specific folders:
storage/roms/nes/,storage/roms/snes/, etc. - Restart the container to trigger filesystem sync
- Check container logs for sync messages
- Ensure RetroArch WebUI is enabled on Apple TV
- Verify
RETROARCH_IPis correct - Check that port 80 is accessible on your Apple TV
PixelBridge provides a RESTful API for programmatic access:
GET /api/roms- List all ROMsGET /api/roms/:id- Get ROM by IDPOST /api/upload- Upload ROM fileGET /api/platforms- List supported platformsPOST /api/retroarch/push/:id- Push ROM to RetroArchGET /api/debug/config- View configuration (debug)GET /api/debug/filesystem- View filesystem status (debug)POST /api/debug/cleanup- Clean up orphaned files
Full API documentation coming soon.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- IGDB - Game metadata and cover art
- RetroArch - Emulation platform
- React - Frontend framework
- Express - Backend framework
Made with ❤️ for retro gaming enthusiasts