I've been putting together a side project for the last while and finally feel okay showing it around properly: RetroPlay, a browser hub for old-school games that all run through WebAssembly. No installers, no accounts, no "download our launcher first" — you open a page and you're already playing.
Repo: https://github.com/MahanKenway/RetroPlay Live: https://mahankenway.github.io/RetroPlay/
How it actually started
It began as basically a Doom WAD launcher one of those "let's see if I can get Doom running in a browser tab" weekend experiments that a lot of people have tried at some point. Mine actually worked well enough that I didn't stop after the weekend. I kept poking at it, then kept adding to it, and at some point it quietly stopped being "a Doom thing" and turned into something bigger: a small curated collection of separate game runtimes sitting behind one shared hub.
Every one of those runtimes is its own beast. Different engine, different save system, different input model, different everything under the hood. They just happen to live under the same roof and share the same visual shell, so from the outside it feels like one coherent product instead of eight unrelated experiments duct-taped together.
What's actually playable right now
This is the part I care about the most, honestly, because I got tired of retro gaming sites that advertise ten consoles and a thousand games and then, the second you click play, ask you to upload a ROM file you obviously don't own and never will. That model always felt dishonest to me. So the rule I set for RetroPlay from day one was simple: if a game is marked "Ready" in the catalog, it comes bundled with free, legally distributable content, and it just runs. No uploads, no accounts, no asking the player to go find something sketchy on the internet first.
Here's what's actually sitting in the Ready column right now:
Doom / Freedoom catalog — the original launcher that started this whole thing, still very much alive and still the entry point for a lot of people
C-Dogs SDL — a top-down run-and-gun that's more fun than it has any right to be for something this old-school
GNU FreeDink — the weird little action-adventure title that basically nobody remembers exists anymore, which is exactly why I wanted it in there
OpenTyrian2000 — a vertical shooter that scratches a very specific itch if you grew up on that genre
LibreQuake — a Quake-style first-person shooter running entirely on free data, no Quake WAD required
OpenTTD — and yes, this means the full transport strategy experience, timetables and all, sitting in a browser tab
FreeRCT — theme-park building in the classic RollerCoaster Tycoon spirit, without touching any actual RCT assets
Neverball — 3D ball-rolling physics puzzles, and I want to stress this is real gameplay captured from the actual runtime, not some rendered concept screenshot pretending to be gameplay
On top of that there are two entries I deliberately left visible instead of quietly hiding, because I'd rather be upfront about what's finished and what isn't. ECWolf is there as an engine-only host — it plays Wolfenstein-3D-engine games, but you have to point it at your own legally-owned game data, so it's not a one-click bundled experience. OpenResident is even more of a side experiment than that: it's basically a "can WebGL2 and WebAssembly actually handle something in this ballpark" technical probe, not a playable Resident Evil game, because the upstream engine it's built on doesn't ship with any actual game data to run. I could've just deleted both from the catalog to make the project look more polished, but that felt dishonest too.
Why WebAssembly, and why this isn't "just another emulator site"
Most of what's in RetroPlay isn't emulated in the classic ROM-emulator sense at all. These are the actual open-source game engines C-Dogs, FreeDink, OpenTTD, Neverball, and the rest — compiled with Emscripten directly to WebAssembly and dropped straight into the browser. That's a meaningfully different thing from running a ROM through an emulator core, and it's the whole reason licensing ended up being such a big part of how this project is structured. I only bring in engines and asset packs that are genuinely free to redistribute, whether that's Freedoom, OpenGFX/OpenSFX/OpenMSX for OpenTTD, or the clean-room content that ships with FreeRCT. Nothing commercial gets repackaged or smuggled in anywhere, on purpose.
How it's actually built, for anyone who cares about that side of it
The hub itself is intentionally boring on the frontend side plain HTML, CSS and ES modules, no framework doing anything clever. Each game runtime lives on its own separate page and loads its own WASM build independently, so nothing steps on anything else's dependencies or global state. That separation was a deliberate choice; it made adding new runtimes way less risky than if everything shared one big bundle.
On the infrastructure side, GitHub Actions handles the whole pipeline: it installs a pinned Emscripten SDK, compiles every engine module, copies the static frontend into a dist/ folder, and ships the finished artifact to GitHub Pages. There's no backend server involved at any point — this is a static site from top to bottom, which also means hosting costs are basically zero and there's nothing to keep patched or worry about going down.
If you want to poke around locally without doing a full rebuild, it's genuinely just:
git clone https://github.com/MahanKenway/RetroPlay.git
cd RetroPlay
python3 -m http.server 4180 --directory dist
That spins up an already-built artifact. Actually rebuilding the engines from source is a bit more involved — you need a pinned Emscripten toolchain plus the per-game build scripts that live in scripts/, run in the same order CI uses so you're testing what actually ships.
Where this is going next
I'm slowly adding more free-content runtimes whenever I come across an open-source engine that feels like it deserves a slot — I'm not trying to rush this into being some giant catalog overnight, quality and licensing sanity matter more to me than raw numbers. Touch controls are also an ongoing project on my end, because I want the mobile experience to actually feel good and playable, not just technically function if you squint at it on a small screen.
If anyone here has built something similar, or knows of an open-source engine with genuinely free redistributable content that you think deserves a spot in the catalog, I'd honestly love to hear about it in the comments. That's a big part of why I'm posting this here instead of just letting it sit quietly in the repo where nobody stumbles across it.
To be clear about the intent: this is a non-commercial, preservation-minded project. Nothing here is being sold, there's no paywall, no ads shoved in your face, no account wall. It's just old games and classic engines staying playable in a normal browser tab without a ton of friction getting in the way.