Hypercolor Asteroids

Side project · MIT

An arcade game in one HTML page, wrapped in a second game played through its git history.

Two seats, one keyboard, about four minutes to die: that is the smaller half. The other game is played in the repository around it, where the rulebook runs as a program, the ambush you write never fires for you, and the field you fly tomorrow was set by what somebody did to that rulebook tonight. This page is the excerpt; the whole thing is the repository.

Mid-wave, two seats: the ship at bottom left is on the end of a lit grapple line, swinging around the dotted arc rather than being reeled in, while a kraken breaks apart under fire on the right.
role
Sole author
scope
16 rules · 20 referee tools
built with
One HTML page · Canvas · sh
license
MIT
status
36 versions landed

The cabinet

One page, whole install

Two pilots, one keyboard. Rocks split, a kraken dives and surfaces underneath you, a grapple swings you rather than reels you in, and a smuggler turns up with one enormous laser. The field guide on the splash screen is generated from whatever registered itself, so it cannot go out of date.

Opening index.html is the whole install: no dependencies, no build step, nothing fetched. That is a checked promise rather than a hoped-for one, which is the first place the second game shows through this one.

GR2

The cabinet

A referee greps the repository for lockfiles, bundler configs and fetch. The game stays one page because a program checks that it has.

The game within

Played in the repository

Somebody lands a version tonight. You pull on Thursday, press Enter, and find out what changed by playing it: no changelog, no announcement. The diff is not the deliverable; the surprise is.

36 versions have arrived that way, and the README still describes the cabinet rather than the changes, because a release note would spend the only thing the format has. Nobody assigns the version numbers either; they are read off the history.

versions landed
36
changelogs
0
pilots
2

The referee

The rulebook runs as a program

The second game needed a referee that never sleeps, so the rulebook is executable: 16 golden rules on one page, eight of them unbendable, each backed by one of 20 small tools written in sh. A rule without a tool behind it is an opinion; these run in the hooks and in CI, against every commit.

Bending a bendable rule is always allowed and never quiet: one line in the commit message and you are through, on the record, in a history that remembers who wrote it. What that costs comes two sections down.

The repository also keeps its own chronicle (a page that writes itself a chapter per version) and a board of flight records nobody can type their way onto. The next three sections are the three rules the whole game hangs on, each carrying its number in the rulebook.

The trap

The ambush you write never fires for you

GR11

The trap

Wave four, from the seat: rock closes into a ring with exactly one gap left, the thing doing it is named across the field, and a glyph counts it down at the foot of the screen.

Somebody wrote that ambush, and it fires for everyone except them. No override exists, because the mechanic rests on nobody being able to disarm the one that is waiting for them: every pilot who lands a trap is also flying into every trap the others landed, and from inside the game there is no way to know which is which until the field starts closing.

It is the git game's best trade. The thing you contribute is a thing you specifically will never see, so the only reason to write one is to do something to the other seat, which is what a two-player game played through a repository actually is.

An ambush firing at wave 4: rock closing in a ring with exactly one gap left, the trap named across the field, and its glyph counting down at the foot of the screen. Whoever wrote this one will never see it.

The ledger

Bend a rule, raise your own difficulty

GR12

The ledger

Some nights the field is meaner than you left it: ambushes arrive sooner, and past a point the ones you wrote yourself stop sparing you, with nothing on the splash screen saying why.

The why lives in the history. Every rule-bend is counted off the git log into a ledger the game reads at play time; nothing is blocked, your field simply gets harder. The difficulty you fly against was set away from the cabinet, by what you did to the rulebook, and the only place it is written down is a file you are not looking at while you play.

  1. 0 bends

    An empty ledger. Nothing at all; the field behaves.

  2. 1 or more

    Ambushes come for you sooner: the interval scales down, to a floor of half the usual gap.

  3. 3 or more

    Author immunity is revoked: traps you wrote yourself start firing at you.

  4. 4 or more

    A wave turns up carrying one more ambush than it should.

Three clean landings ease it back off. Going round the referee instead of through it costs two rather than one, and that is not a loophole left open: the ledger is recomputed from the history rather than trusted, so any commit whose ledger disagrees with the history is refused. It is the one number in the project nobody writes for themselves.

The tape

The game writes tapes, or they are not tapes

GR14

The tape

Fly a run to the end and the game-over screen seals it into a black box: eight hex digits, printed where you can read them off the glass.

A referee reads code; it never presses Enter. So the promise that the game still plays is checked by quota instead: a sealed flight buys three landings, and landing a fourth version without having flown one means writing down why.

Nobody writes a tape by hand: a red line pointed straight at the assistant sitting at this keyboard, because an agent is exactly what you would ask to manufacture the evidence. The seal is honesty rather than security and the repository says so: eight hex digits are eight hex digits. What it costs is inventing a number that must not already be on a public board, in a history that remembers who wrote every line of it.

The tape, on the screen it comes off. The record is X-ed out here on purpose.

The turn

One turn, prompt to merge

Most turns on this cabinet are taken through Claude Code, and this is what one looks like when a version lands: the pilot types a sentence, and the assistant walks the whole ritual: looks around, reads the rulebook, builds the comet in its own file, faces the referee, and flies the build before calling the work done, because GR1 is a promise to somebody who is not in the room.

session-brief: v36 on the cabinet · flight meter: 1 of 3

Add a comet: fast, once a wave, worth double.

v36 is on the cabinet and nobody owns a comet. GR3 wants its own file, a guide tile for the splash screen, one line in the manifest.

Bash(tools/chronicle.sh --recent 8)

v36 on the cabinet · 2 pilots · the last ambush landed three evenings ago

Read(GOLDEN_RULES.md)

16 rules 8 red lines, 4 budgets, and GR8 on your honour

Write(src/entities/comet.js)

+121 lines · register({ reset, update, draw, guide })

Edit(src/features.js)

+1 line, alphabetical being listed is what puts it on the board

Bash(tools/golden-check.sh)

GOLDEN RULES all rules, advisory clear

The referee reads code; it never presses ENTER. GR1 wants the build flown.

Bash(python3 -m http.server 8000)

flown to wave 3 the comet crossed twice, paid double once, and a kraken ended the run

Bash(tools/branch.sh a-comet-worth-chasing)

game/a-comet-worth-chasing the mark read off the diff, never typed

commit message

Comets, and one a wave is plenty

Chronicle: Dave wanted something worth
           chasing. A comet crosses once a
           wave now, pays double, and does
           not slow down to be caught.

Bash(git commit)

v37 is on the cabinet. docs/index.html has the chapter.

Bash(gh pr create)

#31 opened · label: game · the merge button is the pilot’s

What you changed

v37. A comet crosses once a wave; catch it and it pays double, miss it and it is simply gone.

Your move

1. Press merge; the ground crew files the chapter.

2. git pull && open index.html. The rest you find out by playing.

The replay is illustrative, but nothing in it is invented: every tool is a real file in the repository, the referee’s verdict is quoted from it, and the comet is the worked example the project’s own instructions use. The Chronicle: line in the commit message is the sentence the book prints; the hooks count the version and write the chapter on their own. What is left for a person is the merge button, and the next pilot still finds out what landed by pressing Enter.

Numbers

Counted off the repository

commits in five days
278
files in src/
68
referee tools, in sh
20
rules, 8 unbendable
16
Claude Code skills
8

Counted off the repository on 10 August 2026, five days after the first commit.

Five days old, 2 pilots. The social half is designed for a room and has so far been tested by a room of two, so whether the difficulty loop reads as funny or as nagging at ten pilots is unproven. Most turns here are taken through Claude Code, and the repository says so: the checks live in the hooks, in a per-commit CI verdict and in a person pressing merge, none of which asks who typed the diff.

Insert coin

Four minutes to die

Two seats, one keyboard, nothing to install. The game is the shortest way into the repository, and the repository is the whole thing.