Verdigris VerdigrisDocumentation
Play
Reference/Overview

Verdigris

Last updated 2026-08-29

A living 1890s city district that brings its troubles to your desk.

Named for the green patina on its brass. White stone, gold leaf, civic bunting, arc lamps, pneumatic post, one tram line, one dirigible mooring mast. Toned-down steampunk, in the register of inkle's 80 Days and BioShock Infinite's Columbia.

The theme is civic pride papering over rot. The district presents beautifully and is quietly failing underneath. That is not flavour text: rot is a simulation variable that decides whether a repair that was ordered actually happened, and the courts behind the gold-leaf frontages are a spatial fact the generator produces.

You are Verdigris's alderman. You never place a building. Named residents bring real conditions to your desk: a failing house, aggrieved hands, a public door needed before the rain, sickness behind doors, or a disputed public account. You inspect the people and place, follow them through the day, and spend a small number of measures of influence. The ledger judges what the city actually did, not which button you pressed. Every seventh dawn, named patrons and opponents physically come to the square and put your record before the ratepayers; their vote changes how much influence the chair can move during the following week.

Running it#

npm install
npm run dev        # the local dev server
npm test           # vitest
npm run build      # tsc && vite build
VERDIGRIS_WEB_ROOT=/path/to/webroot ./deploy.sh   # build, then rsync dist/

?seed=coppergate generates a different district. ?ui=3 scales the panels up.

Docs#

Shape of the code#

Three contracts that nothing may violate:

  1. Integer transform. Zoom is 1, 2 or 3 and never fractional. Every atlas pixel lands on an exact N by N block of device pixels.
  2. Palette. Every non-transparent pixel belongs to a finite render palette, and alpha is 0 or 255. Lighting variants quantize into palette banks. This keeps the ID buffer exact and prevents blended browser colours from creeping into the art.
  3. No gradients on the world canvas. Baked dithered sprites only. Smooth gradients live in the UI DOM layer.

Where it is#

Live at https://lakesidegames.net/games/verdigris/

Built and playing:

Measured behaviour: undisturbed, the district settles at an average facade of 610 against an average fabric of 520. Fourteen days of funding the bunting takes facade to 669 and fabric to 462. The city looks better and is structurally worse.

Not built:

Time is forward only. The sim is deterministic so a true rewind is a replay, and a replay of a day costs about 300ms; affordable, but it needs a snapshot ring to stay affordable over a month. The control says "advance to" and means it.

Ask