June – July 2026
Play test
Twelve commits in two months, the last of them play test tweaks on 16 July. The
feature they build is a third boot mode: the server embeds a level’s raw JSON directly
into the page so a single scene starts “straight from the embedded level data —
no fetch to the gated /game/levels endpoint”.
Which is to say: a way to hand someone one level, as a link, without an account. After
four years of building the thing, a way to show it to people.
February – March 2026
Go out, Bun in
The backend is replaced end to end: added initial express-server WIP → new deployment
docker progress → replace old server → new server deploy try 1 → new server deploy
try 2 → move client into client directory → move server into src directory.
The eighteen-commit day on 7 March is the busiest in the project’s history. What is left
over: the design bible still describes a Go backend that no longer exists, and the build
script carries the line “Go server copy steps removed” like a headstone.
January – February 2026
The design bible, written after the game
Four years in, the documentation arrives all at once: add pitch deck · add characters
and enemies · added narrative pillars · gdd in place. Thirty-one markdown files,
5,400 lines.
Reading it against the git log, it is clearly a recording of decisions already made
rather than a plan for ones to come — which is why the pillars read as rules instead of
themes. One of them forbids ever explaining where the Corruption came from:
“Theories are allowed; certainty is not.”
The same stretch brings the map system — a hand-drawn star chart of floating islands
under a procedurally generated fog that burns away region by region. The fog is
multi-octave noise on a canvas with per-layer scroll speeds; the regions are hand-drawn
SVG paths, which required building an 828-line path editor to draw them in.
And seven consecutive commits named refactor omni-menu — the in-game menu that you
navigate with Shift+H and Shift+L between tabs and j/k within one. In a game
about Vim, the menu has Vim bindings.
December 2025 · the densest month
Doors, tokens, and a 1988 PC speaker
Eleven commits on Christmas Eve, ten on Christmas Day. Doors, collectables, token
overrides, positional rules, fuzzy search in the command palette, big changes in story
— and the detail that says the most about the project:
testing legendary dangerous dave sounds for reference
The sound effects are not recordings. They are the original 1988 Dangerous Dave
PC-speaker data — arrays of hex divisors where frequency is 1193180 / divisor,
0x0000 is silence and 0xFFFF ends the sequence — replayed through the Web Audio API
with an envelope tuned for the sharp attack and release a real PC speaker had.
May – July 2025
Tests, and one honest sentence
A refactoring stretch — the sound manager comes out of the god scene, entities get a
state machine, make bezier deterministic — and then, on 1 July:
working tests !!! · more tests :)
Three days later, the diff renderer lands. It compares your buffer against the target
with a vendored Patience Diff, then paints wrong characters as infection using stacked
CSS gradients — one colour stop per character — so one animated element shows through
only where the text is corrupted. The author’s summary, committed verbatim and never
revised:
i think the paintCode algo is ready. don’t ask me whats
going on there
It does get revised once, but only on principle: change wrong-deleted to missing-chars
— its more logical.
March 2025
The bestiary
add evil caster WIP, wip tokenizer, projectile WIP — and, on 18 March, a commit
that is three words long and entirely self-explanatory:
add primeagen
The boss of the game is a cut-out photograph of a well-known Vim streamer with glowing
red laser eyes. There are four variants of him in the repository and a full animation
sheet — idle, prepare, attack, watch.
January – February 2025
The deployment comedy
Server, user controller, login page, GitHub workflow — and then the part every CI
pipeline extracts from its author. The commit messages, in order:
retest auto deploy · testing auto deploy · another try · check ·
t · dunno · purge retray · purge retray · purge retray
· purge retray · purge retray
Five consecutive commits named purge retray. The pipeline that came out the other side
runs Playwright in a container, builds a Docker image, gzips it, scp’s the tarball to a
VPS, purges the Cloudflare cache and health-checks in a loop — with a Telegram message
at every stage.
One comment in the deploy script is a production bug written down so it cannot happen
twice: the old container has to be stopped first so it releases the port, because
recreating in place races on it — and when the new container then fails to bind,
restart: unless-stopped leaves the old one running on stale code. It looks up. It was
never deployed.
January 2025
Text becomes terrain
The central mechanic gets built in a run of commits that read like someone feeling their
way forward: add words polygons and wip physics events → phisics wip → wip physics
→ wip player death → add hurt blood effect and die blood effect.
What it amounts to: every rendered character is measured at runtime through a DOM range,
converted into world coordinates, and given an invisible physics body. The letters are
the platforms. Which immediately creates a problem nobody else has — move words
platform on resize, because when the text reflows, the level geometry has to be rebuilt
from scratch.
October 2024 · ~40 commits
Building the thing that builds the game
It comes back, and it spends the entire month not on the game but on the tooling for it:
add a way to start the level in the designer · loading screen and export lvl json ·
add smart tree · add rules editor · save changes to disk · can create new scene
· can save work to disk now · now we can delete files.
By the end of the month there is a full in-browser level editor with a scene tree, a
rules form and disk persistence — which is why the content count later climbs to 96
segments without the pace ever looking heroic. The month closes with add background and
mycelium-sprout !! and add some grimdark flavor.
January – September 2024
Three commits in nine months
The longest gap in the project. Nothing in February. Nothing in spring. Nothing in
summer. The kind of silence that usually means a repository is finished.
August – December 2023
It becomes a game
Emoji support, talking bubbles, particles when you delete a character, a scene manager,
parallax backgrounds, saved progress, and then the beginning of the thing that makes the
whole design work — wip automatic rules checking for reset, next, collect, timer,
keypresses. Win conditions become data on the day they are invented.
And then, on 19 December 2023, two commits in a row that decide what kind of game this
is:
getting tracktion
add scary part
A Vim tutorial on the nineteenth, a horror game on the nineteenth.
15 July 2023
“getting serious”
That is the entire commit message, and it is accurate — everything after it is a real
project. The first hard problem is immediate: how does a character standing on text know
where the text is?
The first answer was move to cursor with mutation observer — watch the DOM for changes
and react. Six weeks later it is thrown out for use update to move to cursor instead of mutation observer, reading the editor’s own update cycle instead of spying on its
output. Watching the DOM tells you something changed; asking the editor tells you what.
November 2022 · 4 commits
A seed, then nothing
init, add wizard, add assets, add docker file. Four commits over two days, and
then the repository goes quiet for seven months.
Worth noting what is already there: a wizard, some art, and a Dockerfile. The instinct
to make it deployable arrived before the game did.
The shape of a long project
Two thirds of the weeks in this repository are empty. The gaps are seven months, then nine, then eight, then four. By the usual measurements it looks abandoned four separate times.
But each return built something that made the next one cheaper: the 2023 return built the rules engine, so levels became data. The 2024 return built the editor, so levels became a form. The 2025 return built the physics and the tests, so the thing could be changed without breaking. By 2026 the content could grow to 96 segments in a few dense months, because four years of scaffolding were already standing.
The other tell, and an unusual one: zero TODO, FIXME or HACK comments across 187 TypeScript files. What there is instead is comments that explain why something strange is correct — including one marking a branch as permanently dead and explaining that fixing it would change behaviour, and one, left in the shipped code, that reads in full:
// commenting this fixed the resize on second preview level error -WTF?
// im not sure why i needed this in the first place