CRT Play
Where Retro Games Come to Life
100% legal open-source homebrew games. Play in your browser — no emulator, no setup, no risk.

Browse by Platform
Select a platform to explore its game library
Latest Field Notes
Game history, creator interviews, and retro culture

The CRT Effect: The Display Technology Your Retro Games Were Designed For
CRT displays weren't just a delivery mechanism — they were the final rendering step in the pixel art pipeline. Scanlines, phosphor bloom, and color bleeding were features, not bugs. This is the physics, history, and engineering behind why retro games look 'wrong' on modern displays.
Read article
How We Picked 31 Games (and Rejected 6 More)
Eleven GBA candidates. Two made it. The other nine? Three killed by copyrights. Three killed by technical dead ends. And three... well, we'll get to those. This is how we picked them.
Read article
NES Emulator in 50KB of JavaScript: No WebAssembly Required
jsnes is 50KB of pure JavaScript — no WebAssembly, no SharedArrayBuffer, no cross-origin isolation. Ten NES ROMs (1.3MB raw) compress to 660KB with Brotli. The hardest engineering problem we solved was a 44KB Flappy NES crashing at the fifth level because of an unhandled 6502 opcode. This is the story of why NES emulation in the browser is easy — after you've done GBA.
Read article
How We Put a GBA in Your Browser: 256MB SharedArrayBuffer and the Limits of WebAssembly
NES emulation fits in 50KB of JavaScript with no special headers. GBA emulation needs 1.9MB of WebAssembly, 256MB of shared memory, cross-origin isolation headers, and a Service Worker. We shipped two games and removed six. Cold 4G users wait 65–135 seconds; desktop waits 6–13. This is the story of what we built, what broke, and what we left broken on purpose.
Read articleShare Any Game on Your Site
Every game on CRT Play comes with a free embed code. Add retro gaming to your blog, portfolio, or community — no ads, no tracking, just pure gameplay.