Skip to content

Roadmap

Retro Jack edited this page Jun 12, 2026 · 53 revisions

Roadmap

What we've shipped, what's next, and what we've ruled out. This page is the project's running ledger — when a candidate comes up, the answer is here.

The scope rule: 8-bit era only

Every shipped system belongs to the 8-bit microcomputing/console era — roughly 1975 to 1990. The cutoff is era, not strict CPU bit-width.

In: anything from the 8-bit era — Apple I/II, Atari 2600 / 400 / 800XL / 7800, BBC Micro / Master / Electron, Commodore PET / VIC-20 / MAX / 64 / 16 / Plus/4 / 128, MSX1 / MSX2, NES, Vectrex, ColecoVision, Intellivision, ZX81 / Spectrum, Amstrad CPC, Tandy CoCo, TI-99/4A.

Out: systems that defined the 16-bit GUI/console leap (Atari ST, Amiga, Macintosh, Archimedes, Sega Genesis, SNES, PC-Engine), and anything 32-bit+ (Saturn, N64, PlayStation, Neo Geo). The era rule is about the kind of system, not the calendar year — Genesis (1988) overlaps the calendar 8-bit era but represents the jump to 16-bit hardware and is out.

Intellivision (CP1610, 16-bit ALU) is the technical edge case the era framing handles cleanly: Mattel marketed it as "the first 16-bit console", but it's universally grouped with 8-bit-era consoles (1979 launch, Atari 2600 contemporary). In.


✅ Shipped (19 emulator engines, 28 sub-systems)

Category Platform Year Dir Engine Notes
Console Atari 2600 1977 stella/ EmulatorJS + Stella (stella2014)
Console Magnavox Odyssey² 1978 odyssey2/ libretro-o2em → WASM + custom SDL2 frontend EJS path dead; o2rom.bin BIOS bundled
Console Intellivision 1979 intellivision/ jzIntv WASM (custom loader) exec.bin + grom.bin BIOS bundled
Console ColecoVision 1982 coleco/ EmulatorJS + gearcoleco RetroPad → numpad keypad remap
Console Vectrex 1982 jsvecx/ DrSnuggles/jsvecx Mine Storm in BASIC slot
Console NES 1983 jsnes/ EmulatorJS + FCEUmm libretro dir name predates migration
Console Atari 7800 1986 js7800/ raz0red/JS7800
Apple Apple I 1976 apple1/ scullin/apple1js 10 tapes (Integer BASIC + 6502 asm)
Apple Apple ][+ 1977 apple2/ whscullin/apple2js (webpack) URL rewrite ?game=?disk=
Acorn BBC Micro 1981 jsbeeb/ mattgodbolt/jsbeeb
Acorn Acorn Electron 1983 electron/ dmcoles/elkjs row-doubling display fix
Acorn BBC Master 128 1986 jsbeeb/ jsbeeb ?model=Master shares build with BBC
Atari Atari 400 1979 atari800/ atari800 WASM (self-built) ?machine=atari
Atari Atari 800XL 1983 atari800/ atari800 WASM (self-built) default; shares core
Commodore PET 1977 pet/ Thomas Skibo's pet2001 (vanilla JS) PET 2001 / BASIC 2 / 32 K
Commodore VIC-20 1980 vic20/ EmulatorJS + VICE xvic memory_expansions='all'
Commodore MAX Machine 1982 max/ EmulatorJS + VICE x64 (Ultimax mode) Japan-only
Commodore C64 1982 c64/ EmulatorJS + VICE x64
Commodore C16 1984 c16/ EmulatorJS + VICE xplus4 (c16pal mode) shares xplus4 core
Commodore Plus/4 1984 plus4/ EmulatorJS + VICE xplus4
Commodore C128 1985 c128/ EmulatorJS + VICE x128 (native mode) per-game VICII/VDC; scaleY hack
MSX MSX1 1983 webmsx/ ppeccin/WebMSX shared core, ?M=MSX1 flag
MSX MSX2 1986 webmsx/ ppeccin/WebMSX shared core, default machine
Sinclair ZX81 1981 jtyone/ Simon Holdsworth/JtyOne
Sinclair ZX Spectrum 1982 jsspeccy/ gasman/JSSpeccy 3 WASM Z80
Amstrad CPC 1984 amstradcpc/ floooh/chips-test tiny8bit sokol_args URL params
Tandy Color Computer (CoCo) 1980 xroar/ Ciaran Anscomb/XRoar
TI TI-99/4A 1981 js99er/ Rasmus-M/js99er (vanilla JS) .rpk carts

Shared infrastructure:

  • _shared/ — controls.css, frame.css, NumLock JS, VICE softkeys, gamedocs link JS
  • _shared-ejs/ — one EmulatorJS framework + 4 VICE cores + gearcoleco + FCEUmm + Stella cores (9 bundles share; ~25 MB saved vs per-bundle copies)

See Emulators for the per-platform integration stories.


⏳ Still to go

Plausible (8-bit era, browser emulator exists, would need an integration pass)

  • Sega Master System (multiple WASM/JS cores) — 1985, Z80
  • Sega Game Gear (same cores as SMS) — 1990, Z80
  • Atari Lynx (Handy.js / libretro handy) — 1989, 65C02
  • Nintendo Game Boy / Color (many JS options) — 1989, Sharp LR35902 (Z80-derived)

Out of scope under the 8-bit-era rule

Listed for clarity — these are the 16-bit/32-bit transition and beyond.

  • NEC PC-Engine / TurboGrafx-16 — 16-bit-era console
  • Nintendo SNES — 16-bit-era console
  • Sega Saturn / Nintendo 64 / PlayStation / Neo Geo AES — 32-bit and beyond

❌ Rejected (don't re-investigate without new information)

Quality / hosting / library size

  • Sinclair QL (1984) — no turn-key bundle; sQLux build is ~4h project
  • Sinclair ZX80 (1980) — re-investigated 07/06/2026. ROMs OK. JtyOne ZX80 mode is broken (display-sync state machine never fires the keyboard scan). zame-dev's js-zx8x works correctly but ships without an SPDX licence header. Door stays open if either gets fixed.
  • Cambridge Z88 (1988) — OZvm is Java/C++ desktop only
  • Sinclair NewBrain (1982) — MAME driver broken (VFD doesn't get data)
  • Sinclair MK14 (1977) — MAME-only, very obscure (256-byte RAM kit)
  • Microvision (1979) — split-CPU emulators don't pair with available ROMs
  • Commodore CBM-II / B-series (1982-84) — VICE cores exist but the library is ~5 commercial games + business productivity. Not enough content for a 10-entry bundle.
  • Acorn Atom — investigated, didn't meet quality bar.

Out of scope (16-bit, removed)

  • Macintosh Plus (macplus/) — removed 25/05/2026
  • Acorn Archimedes (archimedes-live/) — removed 25/05/2026
  • Atari ST (estyjs/) — removed 25/05/2026
  • Commodore Amiga 500 (amiga/) — removed 25/05/2026
  • Atari 5200 — removed from menu tree
  • Sega Genesis (genesis/) — removed 05/06/2026; Motorola 68000 16-bit

Maintenance threads (shipped systems, open follow-ups)

  • Menu reformat sweep — ✅ done 05/06/2026. Every game menu is a 4-column # Title (Year) CODE layout, year-sorted ascending, alphabetical within year. All 609 echo rows across fs.js verify at exactly 45 chars.
  • Per-game gamedocs pages — ✅ done 09/06/2026. 281 pages across all 28 sub-systems. The 20 gamedocs/jsbeeb/*.html (BBC Micro + Master) were briefly runtime orphans (jsbeeb launches keyless ?disc1= URLs and its Vite dist/index.html hardcodes the corner link to ../controls.html) — wired 11/06/2026 via emulators/jsbeeb/genx-gamedoc-link.js, which maps the disc filename → gamedoc key and rewrites the link href on load. Keyless BASIC / blank-Master launches still fall through to controls.html.
  • Controls-link URL wiringgenx-controls-link.js reads the game key from the live URL params (?game= / ?tape= / ?rom=) when the deferred script runs. amstradcpc and jtyone rewrite their URL on load (stripping ?game=), but the rewrite sits behind an awaited fetch('games.json'), so the deferred link script reads the key before the rewrite lands — no extra plumbing needed. (There is no window._genxGameKey stash; earlier drafts of this page described one that was never implemented.) jsbeeb is the exception that doesn't fit this URL-param model — it has no game key in its URL at all, so it ships its own genx-gamedoc-link.js that maps the disc filename to the gamedoc key instead (see the gamedocs thread above).
  • C128 indie dates — 4 of 7 homebrews (Phazer, Rockfall 128, Wumpus 2.0, World at War) have no internal version stamp anywhere; fall back to zimmers.net file mtimes (one definitive, one fuzzy).
  • MAX Multimax-extracted carts — 7 games extracted from the MultiMax EasyFlash compilation (CSDb release 210760). Remaining unknown banks (Sea Wolf, Le Mans, Avenger, etc.) lack identifiable strings; would need empirical VICE testing or menu-table decode to extract.
  • PET: 3 games skipped — Microchess 2.0, 3D Star Trek, Cosmiads load at non-standard addresses VICE doesn't autostart. Recoverable with manual cleanup.
  • CRT 4:3 bezels — six wired as of 12/06/2026: PC.png (DOS prompt, 09/06), Acorn.png (Electron, 10/06), Pet.png (PET, 10/06), Amstrad.png (CPC, 10/06), 80s.png (Atari 400/800, 11/06), and 70s.png (Atari 2600 / Stella, 12/06 — the first bezel on an EmulatorJS bundle). The core recipe is a layered stack inside .bezel-wrap — black backdrop behind, canvas in the middle, the transparent-hole PNG on top — but the canvas-fill method varies by engine: the PC bezel uses non-uniform transform: scale on the canvas; the atari800 bezel tells the emulator itself to fill via -stretch full -fit-screen both -image-aspect none (its integer scaling made a CSS scale quantised and viewport-fragile); the EJS bundles put the EJS player (#game) in the hole and stretch the canvas to fill — Stella uses #game canvas { height: 100% !important; transform: translateX(-20px) } (height-only stretch closes EJS's letterbox; the px nudge re-centres), which is the template for eventually bezeling the VICE family / Coleco / NES. The other four PNGs (Apple/Commodore/Sinclair/Vectrex) remain staging at emulators/_shared/bezels/. Source-verification note: the maintainer has adopted a no-graphic-provenance-tracking policy for bezels/wallpapers/textures, so wired bezels no longer carry per-image credit comments (the earlier PC/Acorn/Pet "open an issue" comments predate that policy; Amstrad.png keeps a real CC-BY-SA credit because it is genuinely source-cleared).
  • Sitewide 70s wallpaper — ✅ landed 09/06/2026. emulators/_shared/textures/70s-bg.png (seamless arrow-arch pattern) tiled at 220 px via the shared body rule. Suppressed on per-platform controls.html pages via a body.controls-page opt-out.

Clone this wiki locally