Skip to main content

Retro-Go Forks Survey (2026-09-27)

This page lists what the forks of ducalex/retro-go add that our fork (pjcau/retro-go) doesn't have yet.

Method. We listed all 299 visible forks (gh api repos/ducalex/retro-go/forks) and compared each default branch against ducalex:master, then against ducalex:dev. Most forks sit on dev, which is 174 commits ahead of master. We fetched all 45 forks with real divergence into a scratch repository and read their commits and new top-level directories. We also read every branch of the two big "megapack" forks (DynaMight1124, pcgamer404), the other upstream branches, rapha-tech's branches, and three well-known derivatives outside the fork graph: sylverb/game-and-watch-retro-go, esp-cpp/esp-box-emu and Svarkovsky/s3-msx-pc.

Baseline. Our fork is on upstream master (0 commits behind) plus 46 of our own commits. We don't have upstream dev. We already have: launcher + splash, retro-core (NES, SNES + SuperFX, GB/GBC, SMS/GG/SG-1000, PCE, Coleco), gwenesis, prboom-go, duke3d-go, retro-extra (NGP via RACE; Lynx, Atari 2600 and Game & Watch removed 2026-09-29), mame-go (MAME 0.37b5 subset, 8-bit and 68000 boards), wolf3d-go and quake-go (both from pcgamer404/retro-go-pro). Overclock support for the ESP32-S3 is already in master.

Flash budget. This constrains every recommendation below. The app partitions in rg_tool.py add up to about 10.3 MB, plus the 4 MB mamerom data partition, so the 16 MB flash is close to full. Every new app either replaces an existing one or needs the "bootstrap" mechanism in item 2.

Top 10 recommendations​

#WhatSourceAlready ours?EffortLicenseValue
1Duke3D fixes: palette/gamma fix (green cast, RGB565 overflow), PSRAM-sized tile cache, speed improvements, FPS cap, death glitch, cheats menu, expansionsDynaMight1124 Duke3D, ThomasFarstrike integration/fri3d-2026No (same upstream duke3d base as ours)Low: cherry-pick into duke3d-goGPL-2High. Our Duke3D rendering fix is still unverified
2Bootstrap flasher: cores and native apps live as .bin files on the SD card and get flashed on demand into one bootstrapped partition, with a bootloader hook for recovery on power-cycleDynaMight1124 bootstrapNoMedium: launcher + bootloader hook + rg_tool.pyGPL-2High. It unblocks every other new app, because flash is full
3Zelda 3 and Super Mario World as native C ports (not emulated). They run on the 280 MHz STM32H7 Game & Watchsylverb/game-and-watch-retro-go (zelda3/, smw/)NoMedium-high: STM32 porting layer to retro-go API; assets extracted from the user's ROMMIT (zelda3) / check smwHigh. Two flagship SNES games at a guaranteed 60 fps with no emulation cost
4OpenLara (Tomb Raider 1 engine), software rasteriser with PSRAM-resident levels, S3/P4 onlypcgamer404/retro-go-pro openlara/, also in DynaMight1124 megapackNoMedium: 320x240 renderer, fits 480x320 with scalingBSD-2High. A 3D FPS-class port, the kind the user likes
5Cannonball (OutRun engine), README says "full speed on the ESP32-S3", double-buffered PSRAM, parallel road/sprite renderpcgamer404 cannonball/, DynaMight1124 cannonball branchNoLow-medium: already a retro-go appCannonball license (non-commercial, MAME-style)High. Arcade classic; complements mame-go
6Rise of the Triad (Dark War + shareware), OPL3 music, PSRAM memory managerpcgamer404 rott/, DynaMight1124NoLow-medium: already a retro-go appGPL-2Medium-high. Another FPS port next to DOOM/Wolf3D/Duke3D/Quake
7WonderSwan / WonderSwan Color (Oswan core) with double buffering, IRAM render path, save statesnod3011/retro-go-nano-s3 oswan/ (pcgamer404's copy is marked "not working")NoMedium: standalone app on an older APIUnclear (Oswan has no license file in the fork), check before shippingMedium-high. New system
8Commodore 64 (Frodo 4 Lite): PRG/CRT/T64/D64, 1541 drive, SID, virtual keyboardpcgamer404 frodo/, DynaMight1124 c64-frodoNoMedium: needs a keyboard UX for 12 buttonsGPL-2Medium. New system
9PICO-8 (PicoPico + z8lua, tested on about 200 carts) and the Celeste Classic native portDynaMight1124 picopico, pcgamer404 pico8/ + celeste/NoLow-mediumPicoPico: check; ccleste: CC BY-SA 4.0Medium. Huge homebrew library, free carts
10Upstream dev merge: standalone updater app (flash .img/.fw from SD, including partition-table rewrite), SNES audio task + double buffering (#211), multi-core gwenesis option, UTF-8 virtual keyboard for Wi-Fi, improved overclock, gpSP GBAducalex/retro-go devPartly (overclock yes; updater app, GBA, SNES audio task no)Medium: 174 commits, conflicts expected with our SNES/gwenesis work. Cherry-pickGPL-2Medium. The updater fits the bench/SD workflow

Honourable mentions (not in the top 10):

  • OpenTyrian: GPL-2, 35/50 fps shoot-'em-up.
  • ClassiCube: BSD-3, Minecraft Classic.
  • PicoDrive: Mega CD support. On the ESP32-S3 its Genesis speed is about the same as gwenesis. Mega CD not wanted (user, 2026-09-29: games too big).
  • MAME4ALL: 1,603 drivers. Worth diffing against our mame-go driver list.
  • ESP-NOW wireless gamepad / 2-player (thangvv-tech).
  • USB MSC SD access (ashkan89, devinzhang91).
  • Star Wars: Dark Forces (esp-box-emu).

Details per fork​

DynaMight1124/retro-go (51★, most active "megapack")​

https://github.com/DynaMight1124/retro-go. The default branch megapack is upstream dev plus about 12 commits. Every port also has its own branch. The author says openly that most ports were done with AI help and tuned afterwards.

Branch / dirWhatOurs?Effort / notesValue
Duke3D (47 commits over dev)Palette → RGB565 fixes, gamma, PSRAM-sized tile cache, loading-screen fixes, speed-ups, FPS cap, death glitch, cheats + expansions, swim/fly controlsBase onlyLow: same code lineage as our duke3d-goHigh
bootstrapSD-resident cores + bootloader recovery hook (see top 10 #2)NoMediumHigh
openlara, rott, cannonball, celeste, opentyrian (via retro-ports/)Game ports; retro-ports bundles Cannonball/Celeste/OpenTyrian into one app partitionNoLow-medium each; the retro-ports bundling idea saves partitionsHigh / Medium
ecwolfECWolf engine (all Wolf3D/SoD versions); "runs fine on S3"wolf4sdl variant onlyLowLow: our wolf3d-go already hits 62 fps; only useful for Spear of Destiny/mods
PicoDrivePicoDrive Genesis + experimental Sega CD (FAME 68k). "Works at a similar speed to Gwenesis"; Sega CD disabled on the original ESP32 for memory, full speed on the P4NoMedium; 1,340 filesMedium: Mega CD on S3 + 8 MB PSRAM is untested; gwenesis already does 60 fps
mame4allMAME4ALL 0.37b5, 1,603 drivers, metadata forced into .rodata, .bss in PSRAM; CPS1 / Midway T-unit disabledSimilar (our mame-go = mame2000 0.37b5 subset)Low to diff; same romsetMedium: compare driver coverage, borrow the const-ification tool
PCSX-ReARMed-POCPS1 interpreter "boots, very unplayable", no sound, frameskip 7+NoHighLow (curiosity)
sm64Super Mario 64 (sm64-funkey software renderer)NoHigh, asset pipeline from ROMLow: "very slow"
picopico / pico8PICO-8 interpreterNoLow-mediumMedium
c64-frodoCommodore 64NoMediumMedium
neogeopocketNGP app (ngp-go)Yes (RACE in retro-core/retro-extra)—None
PocketSNESSnes9x-derived speed-focused SNESNoMediumLow: our snes9x already hits 60 fps on everything except Kart
gbsp_dynarecrapha-tech's gpSP RISC-V dynarec (P4 only), falls back to the interpreter on S3No—Low for S3
Ports-MenuOne "Ports" tab for DOOM/Duke3D/Quake/… instead of one tab eachNoLow (2 files)Medium: our launcher tab count keeps growing
dynamic-themesTheme backgrounds generated for any number of systems (Art Book Next v3)NoLowLow-medium
SPI2HDMI, CYD, GB300-P4, p4-overclockOther targets / P4 overclock——See Zepan below for HDMI

pcgamer404/retro-go-pro (source of our Wolf3D/Quake)​

https://github.com/pcgamer404/retro-go-pro. This is DynaMight1124's megapack plus 26 commits.

ItemWhatOurs?NotesValue
openlara/, rott/, cannonball/, celeste/, opentyrian/, classicube/, frodo/, pico8/, stella/ (StellaDS)Same ports as the megapack, sometimes newer ("Added Open Tyrian & improved other ports", 2026-09-12)wolf4sdl + quake yes; rest noTake the newest of pcgamer404 vs DynaMight1124 per portSee top 10
oswan/WonderSwan, ships oswan not working.zipNoUse nod3011's working version instead—
store/On-device ROM store; needs self-hosted RG-Store-BackendNoLow-medium; legal exposure depends on what the backend servesLow
ControlsSelect+Start opens the menu, turbo A/B for NES, ROM art next to the ROM fileNoLowLow-medium
sm64-goSee aboveNo—Low

nod3011/retro-go-nano-s3 (ESP32-S3 Nano, 227 own commits)​

https://github.com/nod3011/retro-go-nano-s3. Heavy rework for an S3 board, with commit messages partly in Thai.

ItemWhatOurs?EffortValue
oswan/ WonderSwanWorking WS/WSC, double buffering, IRAM render, save states, resetsNoMediumMedium-high
FCEUmm NES coreWider mapper coverage than nofrendo, FDS disk swap, cheats, "FCEUMM FULL SPEED!"No (nofrendo)MediumMedium: only if nofrendo misses a mapper we need
CheatsGame Genie / Pro Action Replay / GameShark menus for NES, GB, SMS/GG, Genesis, SNES, persisted per gameNoMedium (touches every core)Medium
NetplayGB link cable over UDP ("stable GB Netplay v3"), generic netplay setupNoMedium-highLow-medium (needs a second board)
Self-updaterUpdater for the nano-s3 targetNo—See upstream dev
NGP with IRAM / double bufferingNGP optimisationsWe have NGP (RACE)Low to compareLow

ThomasFarstrike/retro-go (integration/fri3d-2026, 84 own commits over dev)​

https://github.com/ThomasFarstrike/retro-go/tree/integration/fri3d-2026. This is the Fri3d Camp 2026 badge integration.

  • Duke3D: the same palette/gamma/tile-cache fixes that DynaMight1124 picked up (see top 10 #1), plus the upstream-style load_duke3d_groupfile cleanup and PNG texture overrides. Effort: low. Value: high.
  • In-game Retro-Go settings menu inside Duke3D, and a cheats menu.
  • esp_littlefs component, RG_GPIO_SND_I2S_MCK, a CH32X035 I2C expander driver, an ESP-IDF 5.5.1 bump. Useful only as reference.

ashkan89/retro-go (80 own commits, ESP32-S3 N16R8 targets)​

https://github.com/ashkan89/retro-go. The fork includes managed_components copies, so its diff is noisy.

ItemWhatOurs?EffortValue
rg_usb_msc.cSD card exposed as a USB mass-storage drive over USB OTGNoMedium. Conflicts with our USB console (RG_GAMEPAD_CONSOLE / board_ctl.py) if both need the same USB portMedium: copying ROMs without pulling the SD card
rg_usb_hid.c, rg_usb_host.c, rg_usb_xinput.cUSB HID/XInput gamepad + keyboard/mouse (host mode)NoMediumLow-medium
libs/netplayLocal multiplayer (Wi-Fi AP, NES/SMS lock-step)NoMedium-highLow-medium
Media playerAudio player with codecs, library index, streaming, artwork, lyricsNoMedium-highLow
factory/ + rg_firmware.cOTA: launcher downloads .img, factory app installs itNoMediumLow-medium
Screen dim/off timeout, RGB-LED SD activity, hapticsUXNoLowLow

Zepan/retro-go: SPI2HDMI bridge​

https://github.com/Zepan/retro-go. This adds an spi2hdmi-s3 target: an ESP32-S3 drives an SPI→HDMI bridge over QSPI, with 48 kHz PCM HDMI audio through the bridge and UART recovery commands. DynaMight1124 has a matching SPI2HDMI branch. Effort: medium. Value: medium for planning the next console. It is a working reference for TV output on a retro-go S3, to weigh against the LT8912B idea in Plan A.

thangvv-tech/retro-go: ESP-NOW wireless gamepad​

https://github.com/thangvv-tech/retro-go. This adds an ESP-NOW gamepad with pairing/bonding UI, a web gamepad, and Wi-Fi coexistence fixes, plus an ES8311 codec fix. Effort: medium. Value: low-medium; it would allow a wireless second controller.

alecu/retro-go​

https://github.com/alecu/retro-go. This is a Ventilastation POV-disc target and has nothing to reuse for us. It has two small generic fixes worth cherry-picking: a stack buffer overflow fix in rg_system_vlog, and a rg_task_create queue-creation race fix. It also adds gzip-compressed MSX ROMs in fmsx and an unchecked fopen fix in msx_fopen (moot here: fmsx was removed 2026-09-29). Effort: very low. Value: medium, because these are real bugs that are probably in our tree too.

Fri3dCamp/badge_retro-go (and tomvanbraeckel copy)​

https://github.com/Fri3dCamp/badge_retro-go. It has 148 commits but is based on 2024 dev (251 behind master). Items:

  • find_games: downloads games over Wi-Fi.
  • romart and CRC cache for .zip files.
  • Folder previews.
  • Storage free space in the debug menu.
  • A non-recursive rg_storage_delete.

Value: low-medium. Zip romart is the only one we might want.

Upstream ducalex/retro-go branches​

BranchStatus vs our forkNotes
dev (174 ahead of master, 2026-01)Not mergedSee top 10 #10. Also: mapper 165, ADC oneshot driver, rg_system_init(config), REDROID-GO/brutzelboy targets
snes9x-fcipaq (138 ahead)Not mergedfcipaq's SNES test changes on top of dev. Our SNES renderer has diverged a lot, so only mine it for ideas
duke3d, negeopocket, SDL2, input-drivers, launcher-core, background-previews, test-sticky-center1–4 commits, mostly staleduke3d is already the base of our duke3d-go; background-previews (4 commits, 2025) is a small launcher feature

Derivatives outside the fork graph​

ProjectWhatOurs?Effort / licenseValue
sylverb/game-and-watch-retro-go (145★)Retro-go for the STM32 Game & Watch. Extra cores: Zelda 3 and SMW native ports, Atari 7800 (prosystem), Amstrad CPC (caprice32), Watara Supervision (potator), Tamagotchi (tamalib), blueMSX, FCEUmmNoPorting layer is odroid_* compatible (old retro-go API); GPL-2 / per-coreHigh (Zelda3/SMW), Medium (7800, CPC)
esp-cpp/esp-box-emu (136★)ESP32-S3 emulator collection; Star Wars: Dark Forces portNoHigh: C++ espp framework, not retro-go; MITMedium-high (FPS port)
Svarkovsky/s3-msx-pc (60★)Deeply optimised MSX2 on ESP32-S3 with LCD_CAM VGA output (featured on CNX-Software)fMSX yesLicense NOASSERTION; ideas onlyLow-medium: mine it for fMSX speed-ups
kbeckmann/retro-go-stm32Original G&W port, superseded by sylverb——None
rapha-tech/retro-goGBA_dynarec (RISC-V only), osd (transparent OSD), self-updater (2024)NoP4 only / lowLow
Rbel12b/retro-goVGA output via bitluni's ESP32-S3 VGA libNoMediumLow
vanBassum/retro-goWT-SC01-PLUS target (ESP32-S3 + 8080 parallel display, like ours), MCP23S17 gamepad, local sdmmc override for the SD CMD59 issueWe have our own 8080 driverReference onlyLow
fffonion/retro-gogpSP with RISC-V JIT for ESP32-S31NoNot for XtensaLow
devinzhang91/retro-goesplay-nano target + USB MSCNoSee ashkan89Low

JIT / dynarec building blocks (checked 2026-09-29)​

Why: the GBA app (gbsp) is interpreter-bound (~91–115 cycles per GBA instruction, half of it in the per-instruction loop), and a dynarec is the lever for 60 fps on Metal Slug / TMNT. Nobody has a gpSP dynarec for Xtensa (ESP32-S3) yet, but the pieces exist:

WhatWhereLicenseUse for us
gpSP RISC-V dynarec for the ESP32-P4 (Tanmatsu): riscv_emit.h 126 KB, riscv_codegen.h 10 KB, riscv_stub.S 25 KB; JIT cache in PSRAM made executable with a second esp_mmu_map(..., MMU_MEM_CAP_EXEC) mapping. Author reports ~2x; the retro-go issue reports 4–13x over retro-go's interpreter (NFS Underground 2 4 → 30 fps, Pokémon Fire Red 7 → 30); experimental, graphical glitchesIrak4t0n/HowBoyAdvance; integrated in retro-go by rapha-tech GBA_dynarec (issue #349)GPL-2 (gpSP), stated in the fork's INTEGRATION_DYNAREC.md; the HowBoyAdvance repo has no license fileP4 console: GBA dynarec nearly ready. S3: the template for an Xtensa backend (RISC-V, like Xtensa, has no flags and compare-and-branch) and the ESP32 glue (PSRAM exec, cache sync). Our interpreter is already trimmed, so expect less than their gain
68000 → Xtensa JIT, complete, on the classic ESP32 (M5Paper, Palm emulator): m68k_jit_backend_xtensa.c 73 KB, blocks compiled on the second core, ~100 KB IRAM cache (jit_execmem_esp32.c), host tests for the code generator. Interpreter 58% → JIT 87% of real speedmegabytefisher/DragonfruitMITThe Xtensa instruction encoder and executable-memory layer to start from (LX6 → LX7: same instructions, different internal RAM map). Also the base for a 68000 JIT later (Neo Geo, CPS1, Mega Drive)
Executing code from PSRAM on the S3 (esp_mmu_map with MMU_TARGET_PSRAM0 + MMU_MEM_CAP_EXEC)igrr's gist, ESP-IDF MMU docsexample / Apache-2A large translation cache in PSRAM instead of the full internal RAM; its speed through the 32 KB instruction cache has to be measured
Mature Xtensa encoder incl. the windowed ABI (py/asmxtensa.c, emitnxtensawin.c)MicroPythonMITAlternative encoder source
Xtensa JIT for a WASM-like bytecode (jit_xtensa.c)ESPBnoneRead only, do not copy

Estimate with these pieces (sessions of work, not measured): phase 0, a mini-JIT on the board measuring generated code in IRAM and in PSRAM, 1; Xtensa backend for gpSP modelled on the RISC-V one, 2–4; correctness (test ROMs, frame hashes against the interpreter), 3–5; speed, 2–3 — about 8–13 in total. Expected CPU-side gain 2–3x (estimate), enough for 60 fps on Metal Slug (today ~14 ms of CPU in a 21.7 ms frame). Stop after phase 0 if generated code is not at least 3–4x faster than the interpreter loop.

32X stays out of reach on the S3 even with a JIT (two SH-2 at 23 MHz on top of a Mega Drive that already fills core 0); on a P4, PicoDrive's SH-2 dynarec has a RISC-V backend for RV64 only (the P4 is RV32).

Checked but nothing new for us​

These forks only add a board target, pin maps, CI/Docker tweaks, ROM uploads or translations, with no new emulators, ports or reusable features:

  • Board targets:
    • Hzrd-code (LilyGO T-Deck / T-Deck Plus keyboard + PMU)
    • greigs (openbrickgb)
    • canwdev (ESPlay Micro, 20 kHz backlight PWM)
    • mk-822 (T-HMI)
    • lakiax (Xbox BT controller + 0.96" screen)
    • bphermansson (IceQueen)
    • aseoista (REDROID-GO, already upstream in dev)
    • goshansp (brutzelboy, already upstream)
    • GBeetle (ESP32-P4)
    • Chreeperfighter (RV32IM emulator target)
    • KhaledMahfouz5 (Arduino UART keypad)
    • jhq198 (xueersi board)
    • wheniseeyouagain (Katarina/Majula themes, Chinese font)
    • longxiangam (C19 target, font converter with glyph positions)
    • 206003723 (RETRO-BOY-COLOR hardware files)
    • CodingTheRobot, ohdarling, jobitjoseph (ST7789 variants)
  • CI/config-only or ROM/binary uploads:
    • muhammed251210ai
    • Pilothorizon
    • kamilstanik516-cmd
    • serofuku (VFS image injector script)
    • Dewey1975
    • gitboy123455
    • VIHAAN121317
    • skofen
    • KiKi170987
    • Jojotheamazing
    • asger-andersen
    • hazzed-codez
    • pceslayer
    • Zerolone, marchetto1983, hagbardZ and other DynaMight1124 forks (no own commits)
  • Documentation-only: simplyrohan (BUILDING/PATCHING docs).
  • About 250 remaining forks: 0–2 commits ahead, or years stale.

Suggested order of work​

  1. Duke3D fixes. Cherry-pick from DynaMight1124 Duke3D into duke3d-go, then verify on the board. It's low effort and fixes a known open item.
  2. alecu's rg_system_vlog overflow and rg_task_create race fixes. These are small and generic.
  3. Bootstrap flasher. Decide between it and a rebalanced partition map; everything below needs flash space.
  4. Cannonball, ROTT and OpenLara. Bundle them into one retro-ports-style app to save partitions.
  5. Zelda 3 / SMW native ports. A larger project, with the biggest payoff for the SNES-first goal.
  6. New systems: WonderSwan, C64 and PICO-8. Do them by user interest.