If you ever typed LOAD "*",8,1 without looking it up, this one’s for you.
This is a small experiment in vibe coding: using HTML, JavaScript, and a bit of Antigravity to build a deliberately stripped-down C64 “emulator” that doesn’t aim for accuracy — just for maximum nostalgia. No full emulation, no perfection, just the feeling of sitting in front of a real breadbox.
It’s a fun read for former C64 addicts and curious tech folks alike. And if you actually want to play the real games, do yourself a favor and visit Snoopy’s excellent collection at c64games.de — this post is about the vibe, not the high score.
So here’s the idea: build a minimalist one-pager C64 “emulator” using only HTML/CSS/JavaScript with Antigravity as my co-pilot.
Not a cycle-accurate emulator. Not a SID symphony.
Just the essentials:
- a proper-looking C64 screen
- a beautiful C64 font (the real vibe)
- simple BASIC-ish scripts
- support for the standard POKEs you remember (or fear)
Think of it as a nostalgia terminal with enough “C64-ness” to trick your brain into hearing the floppy drive.
What We’re Actually Building (and What We’re Not)
Let’s be honest: a real emulator is a full-on engineering project. This one is intentionally a playful technical toy — and that’s the point.
The goal: a convincing illusion.
- You type in a BASIC-like line, the screen behaves like you expect.
PRINT, POKE, LIST, NEW,maybe some tiny control flow.- Screen memory and colors feel like they’re there.
- It’s responsive, snappy, and lives in a single page.
The secret sauce: the presentation layer.
If the font, spacing, colors, cursor, and scroll behavior are right, your brain does the rest.
And that’s where this becomes weirdly close to operations research, too: we’re optimizing for maximum perceived authenticity under strict constraints (one page, tiny scope, minimal rules). It’s basically: “How much C64 can we evoke per line of code?”
The Antigravity Loop: Implement → Check → Fix → Validate
This is the fun part: the development process with Antigravity isn’t “write it once and done.” It’s an iterative loop that feels like tuning an old machine until it purrs.
Here’s how it plays out in practice:
- Implement a small chunk (e.g., tokenizing
POKE 53280,0, or handling line numbers) - Check it immediately in the browser (does it look right? does it act right?)
- Correct what’s off (cursor blink timing, PETSCII-ish quirks, weird edge cases)
- Validate with tiny “C64 reality tests”
- Does the cursor movelike it should?
- Does
PRINTbehave as expected? Are semicolons supported? - Do standard POKEs influence border/background/text color in the way your muscle memory expects?
And the best part: you keep discovering small imperfections.
The spacing is slightly off. The font rendering is almost right but not quite. POKE works, but the colros don’t mattch. The C64 font is not the original expected font.

So you feed those observations back into Antigravity, and it becomes this productive rhythm of:
“That’s close — but not Brotkasten close. Fix this, preserve that, and don’t break this other thing.”
Where to document/visualize the process (to make it a story)
I’m planning to capture three quick “snapshots” during development, because they tell the tale better than paragraphs ever could:

READY. appears


Live Demo: Let’s Boot This Thing
Alright — time to stop talking and present the emulator live.
When it loads, you should get that unmistakable blue screen vibe. Try a few classics:
- 10
PRINT "HELLO, WORLD!"; - 20 GOTO 10
POKE 53280, 0(border color)POKE 53281, 6(background color)- a tiny loop/pattern test (whatever BASIC subset we support)
And if it makes you lean closer to the screen for a second, just like back then?
Mission accomplished. Get the complete sourcecode of the “emulator” right here.
Next: I’ll share the one-pager as a single file so you can open it locally, hack on it, and help push it through the next iteration of the Antigravity loop — because this thing won’t become “perfect” in one shot. It’ll become perfect the only way old machines ever did:
by tweaking, testing, and lovingly fixing the tiny wrong bits until it feels right.