Demo: https://wizzardsk.github.io/
Play retro games directly from public online sources.
The library covers 200+ systems with 1000+ ROM collections from sources Internet Archive. Thumbnails are fetched from GitHub repositories.
I made this project for my own personal needs, to have the same setup on all my machines.
| Tool | Purpose | Required |
|---|---|---|
| rclone (v1.60+) | On-demand ROM download from Internet Archive | Yes |
| mount-zip | Mounting zipped ISO files (PSP, PS2, PC Engine CD, etc.) | For CD-based systems |
| curl / wget | Bootstrap fetch and asset downloads | Yes |
| unzip / zip | Archive extraction at launch | Yes |
| RetroArch | Main emulation frontend | Yes |
| MAME | Arcade and computer emulation | For arcade/computer systems |
| xemu | Original Xbox emulation (xemu -dvd_path) |
For Xbox |
On Linux, register the play:// URL scheme handler in one step:
bash <(curl -Ls https://raw.githubusercontent.com/WizzardSK/gameflix/main/webflix.sh)On Windows, see Windows setup for the PowerShell installer.
Open https://wizzardsk.github.io/ in your browser and click a game thumbnail to launch it. ROMs download per-game on click; no local install of the web interface is needed.
webflix.sh registers the play:// URL scheme handler with the OS. Clicking a thumbnail on https://wizzardsk.github.io/ then triggers:
- Browser hands
play://<platform>/<source>/<rom>to the OS - OS launches
~/retroarch.sh(3-line bootstrap) - Bootstrap fetches the full launcher from https://wizzardsk.github.io/retroarch.sh
- Launcher downloads the ROM into
~/share/roms/via rclone (Internet Archive S3 session is required for restricted items like NoIntro / MAME-SL / TOSEC) - Launcher fetches the core if it is not installed, and then any firmware that core needs and the system directory does not have (see Firmware)
- ROM launches via the matching RetroArch core or standalone emulator
A core that needs a BIOS lists the exact files in its .info, and a missing one is not an error message — it is a black screen, or a core that exits without drawing anything. The Linux launcher reads that list and fetches what is missing into RetroArch's system directory, from three sources in order:
- libretro's own system zips (
buildbot.libretro.com/assets/system) — support files the project distributes itself, such as Dolphin'scodehandler.bin, PPSSPP's atlas or ScummVM's engine data. One zip usually settles every file a core is missing. - A RetroArch BIOS pack on the Internet Archive — laid out as a system folder, so a name from the
.infois a path in the pack. Covers PS1, Mega CD, Game Boy/GBA boot ROMs, Lynx, PC Engine CD, Atari ST, blueMSX machines and more. - The merged MAME set — for firmware entries that are
.zipfiles (flycast's Naomi and Atomiswave boards), and for the system ROM set amame_libretrodriver needs in~/share/bios(neogeo.zip,stvbios.zip,sms.zip). Restricted, so it needs the same Internet Archive S3 session as the NoIntro/TOSEC ROM sets.
The listings of the first two are cached under ~/.cache/gameflix for a month, and nothing is fetched at all when the files are already there. Anything none of the three has — Intellivision's exec.bin, ColecoVision's colecovision.rom, the Amiga Kickstarts, the PC-FX and X68000 ROMs — is named on stderr with the path to drop it in, rather than passed over in silence.
Windows (retroarch.ps1) does not do this yet; it only warns when a MAME system ROM set is missing.
Windows uses retroarch.ps1 (launcher) and webflix.ps1 (installer) — PowerShell counterparts of the Bash pair. Setup is per-user and needs no administrator rights.
- RetroArch — required. After installing, open Online Updater → Core Downloader and grab the cores for the systems you want to play (e.g.
Nestopiafor NES,Snes9xfor SNES). The launcher findsretroarch.exeautomatically if it's on yourPATHor in a common location (portableC:\RetroArch-Win64, Program Files, Steam,%LOCALAPPDATA%\Programs\RetroArch). - MAME — only for arcade/computer systems. Put
mame.exeon yourPATH.
Open PowerShell (Start → type "PowerShell" → Enter) and run:
irm https://raw.githubusercontent.com/WizzardSK/gameflix/main/webflix.ps1 | iexPrefer a double-click? Download mount.bat and run it — same result, no terminal.
This writes rclone.conf to %APPDATA%\rclone\, installs a small bootstrap, and registers play:// under HKCU. (No execution-policy change is needed — the one-liner runs the script as text.)
Open https://wizzardsk.github.io/ and click a game. The ROM downloads into %USERPROFILE%\share\roms\ and launches in the matching core. Single-file ROMs (NES, SNES, GB, …) load straight from the .zip — nothing extra needed.
Multi-file disc images (.cue/.bin, .gdi) need the whole archive visible. The launcher tries, in order:
- Pismo File Mount (
pfm.exe) — recommended: tiny, free, no Python; mounts zip/iso in place as a folder, no extraction - 7-Zip (
7z.exe) — extracts the whole archive to%TEMP%\gameflix-iso\(cached for reuse); uses disk space - ratarmount + WinFsp — optional, mainly a Linux tool; kept for parity
Install one of these only if you play CD-based systems. For cartridge consoles you can skip this step.
The launcher runs in a hidden window, so on failure it shows a pop-up dialog with the cause and writes a full transcript to %LOCALAPPDATA%\gameflix\launch.log. Common fixes:
- "retroarch.exe not found" → add it to
PATH, or setGAMEFLIX_RETROARCHto its full path. The launcher also re-readsPATHfrom the registry (aPATHedit only reaches already-running programs after the next logon) and looks forRetroArch\/RetroArch-Win64\on every drive, not justC: - A MAME game shows only a black screen → check
launch.log. MAME systems need their own ROM set in%USERPROFILE%\share\bios(e.g.aes.zipfor Neo Geo AES), which the log warns about; the software-list XML the core needs is downloaded automatically into<RetroArch>\system\mame\hash - "Core '…' not found" → install that core via RetroArch's Online Updater, or set
GAMEFLIX_CORESto your cores folder - Other paths/executables are overridable via environment variables read at the top of
retroarch.ps1:GAMEFLIX_ROMS,GAMEFLIX_BIOS,GAMEFLIX_CORES,GAMEFLIX_RETROARCH,GAMEFLIX_MAME,GAMEFLIX_MOUNT
The launcher reads its platform→core mapping from launch.tsv (generated by generate.sh from platforms.csv, served alongside the web interface).
webflix.sh writes rclone.conf to ~/.config/rclone/ with preconfigured remotes. If your rclone is older than v1.60, update from https://rclone.org/downloads/.
generate.sh is the developer script that builds the interface served at https://wizzardsk.github.io/. It:
- Reads platform definitions from platforms.csv and system names from systems.csv
- Generates HTML pages for each platform with game thumbnails
- Builds the full
retroarch.shlauncher with correct core mappings for each system - Generates
gamelist.xmlfiles for EmulationStation compatibility - Filters out unwanted ROM versions (BIOS, prototypes, demos, betas, alternate versions) by default
Generation takes around 30 minutes on slower machines (e.g. ARM Chromebook). End users don't run this — the pre-built version is hosted on GitHub Pages and the bootstrap fetches it on every launch.
- Search — text filter with instant results
- Thumbnail types — switch between Snaps, Titles, Boxarts, and Logos
- Thumbnail sizes — 80px / 120px / 160px / 240px / 320px
- ROM filtering — hide/show Prototypes, Betas, Demos, Alternate versions, Pirated, Aftermarket, and more
- Platform backgrounds — each system page has a themed background
- Lazy loading — thumbnails load on demand with fade-in effect
Gameflix includes special support for fantasy console platforms. Most of these games are played directly in the browser via their official web players; TIC-80 is the exception, because tic80.com sends X-Frame-Options: SAMEORIGIN and so cannot load inside the gameflix frameset — its carts are fetched from tic80.com and run in tic80_libretro through the normal play:// launcher instead.
| Platform | Source | Player |
|---|---|---|
| TIC-80 | TIC-80 API | tic80_libretro (cart from tic80.com/cart) |
| PICO-8 | Lexaloffle BBS | lexaloffle.com |
| Voxatron | Lexaloffle BBS | lexaloffle.com |
| WASM-4 | wasm4.org | wasm4.org/play |
| LowresNX | LowresNX community | lowresnx.inutilis.com |
Game data for fantasy consoles is scraped by scripts in the fantasy/ directory and updated via GitHub Actions.
For Batocera, copy custom.sh to your system folder (/userdata/system/) in the shared drive. It runs automatically at boot and:
- Waits for network connectivity
- Downloads and installs required tools (httpdirfs, fuse-zip, mount-zip, ratarmount)
- Mounts the Myrient ROM library and bind-mounts platform folders to
/userdata/roms/ - Downloads pre-built gamelists and fantasy console archives
- Updates EmulationStation configuration and reloads it
Thumbnails are downloaded on-demand when a game is selected in EmulationStation (handled by game.sh).
AMD64 version also supports zipped libraries for fantasy platforms.
For Recalbox, copy custom.sh to your system folder in the shared drive. It runs automatically at boot. Supports armv7l, aarch64, x86_64, and i386 architectures.
Recalbox version is no longer maintained as I no longer use it.
gameflix/
├── generate.sh # Main web interface generator (developer-only)
├── webflix.sh # Installs play:// scheme handler bootstrap
├── mount.sh # Remote one-liner wrapper for webflix.sh
├── gamelist.sh # GitHub Actions CI/CD script
├── retroarch.sh # ROM launcher prefix (start of assembled script)
├── retroarch.end # ROM launcher execution logic (end of assembled script)
├── retroarch.ps1 # Windows ROM launcher (reads launch.tsv)
├── webflix.ps1 # Windows play:// handler installer
├── mount.bat # Double-click Windows installer (wraps webflix.ps1)
├── launch.tsv # Generated platform→core/ext/src table (Windows launcher)
├── platforms.csv # Master database of ROM collections (760+ entries)
├── systems.csv # System short names → display names (145 entries)
├── rclone.conf # Rclone remote configuration
├── platform.js # Platform page generator (JS)
├── script.js # Filtering and UI logic
├── script2.js # Lazy loading for thumbnails
├── style.css # Dark theme styling
├── fantasy/ # Fantasy console scrapers and data
│ ├── fantasy.sh # Master update script
│ ├── tic80.sh # TIC-80 scraper
│ ├── pico8.sh # PICO-8 scraper
│ ├── voxatron.sh # Voxatron scraper
│ ├── wasm4.sh # WASM-4 scraper
│ └── lowresnx.sh # LowresNX scraper
├── batocera/ # Batocera-specific files
│ ├── custom.sh # Boot script
│ ├── game.sh # On-demand thumbnail downloader
│ ├── messSystems.csv # MAME MESS system configs
│ └── ... # Pre-compiled binaries and ES configs
└── recalbox/ # Recalbox-specific files (unmaintained)
├── custom.sh # Boot script
└── ... # Binaries and configs
- ARM64 libretro cores: https://github.com/christianhaitian/retroarch-cores
- BIOS files: https://github.com/PIBSAS
- Rclone: https://rclone.org/downloads/
