Devlog · Vimancer

Four years of picking it back up

591 commits between November 2022 and July 2026 — spread across 191 weeks, of which 125 have no commits at all. This is the long one: a project that got put down for seven months, then a year, then eight months, and came back every time bigger than it was.

Nov 2022591 commits · 66 active weeks of 191Jul 2026

About the project


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 eventsphisics wipwip physicswip player deathadd 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 WIPnew deployment docker progressreplace old servernew server deploy try 1new server deploy try 2move client into client directorymove 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