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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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 and the editor rules
file still describe a Go backend that no longer exists, and the
build script carries the line
“Go server copy steps removed” like a
headstone.
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.
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