2026-11-11 · 6 min read

How a Non-Engineer Built Isometric Burlington

Isometric Burlington is my city drawn the way a city-builder game would draw it. You can pan from the waterfront to Winooski, turn the whole map to look from any of four sides, and search for an address. Night falls at the real Burlington sunset, the weather follows the live forecast, GMT buses run their routes on the timetable, and planes into BTV cross overhead at their actual altitude.

I saw Isometric Toronto and Tiny London and wanted the same thing for the place I live. It also turned out to be the most honest test I've run of what one person can now make with image models. The whole map went from an empty repository to a live site over three days, November 9 to 11.

What I built

The idea is simple to say. Take a 3D model of the city, photograph it from a fixed game-style angle, and have an image model redraw every photo as an illustration. The practice has five steps.

  1. A camera grid. One fixed frame centred on Church Street, an orthographic camera tilted 30 degrees down, at about a quarter metre per pixel. The city is cut into 458 blocks of 4,096 pixels, across four camera headings so the map can turn.
  2. Renders. Headless Chrome renders Google's photorealistic 3D tiles for every block, in colour and in height. GitHub's free runners did this work, ten shards per view. Any frame where a tile failed to load gets thrown out and rendered again.
  3. A teacher set. A large commercial image model redrew a few hundred sample frames in the style I wanted, with automatic checks rejecting the bad ones. About 300 before-and-after pairs survived.
  4. A style of my own. Those pairs trained a small add-on (a LoRA) for Qwen-Image, an open image model, on a single rented H100. After that the open model could draw in the style on its own, cheaply, without calling the commercial model 458 times per view.
  5. Draw and serve. Rented GPUs on Vast.ai redrew every block, one GPU per view, with a prepaid spending cap. Each block was drawn with its finished neighbours pinned in place so the seams line up. The results became a tile pyramid on Cloudflare R2, shown in a Leaflet viewer.

The layer below: the lake

The rendering, the training and the serving were mostly solved problems. The part that took the longest was water.

An image model has a strong prior that land has things on it. Show it a block that is mostly flat blue Lake Champlain and it gets bored, and a bored model invents. In early drafts the open lake sprouted towns, towers, small islands with harbours and ponds in the middle of fields. Each one looked plausible on its own. All of them were lies.

So most of the commit history is a running argument with the model about where the lake is.

None of these is a hard programming problem. They're judgment calls about what the map must never do, and the main one is that it must never show you a town that isn't there. I wrote those rules in plain English, and the code and tests enforce them.

What it cost

The open-model route is the reason this is affordable. The commercial model only drew the teacher set. Everything else ran on GitHub's free runners and on hourly-rented GPUs behind a hard prepaid cap, with a job that deletes any machine left running. The imagery and model licences only allow non-commercial use, so the site has a Venmo tip jar instead of a price.

What building it taught me

Taste is the bottleneck, not code. I couldn't have written a windowed joint sampler with pinned neighbours two years ago, and I still couldn't by hand. What I could do was look at a block and say "that island isn't real", decide that a missing tile is worse than a slow render, and decide that a pretty invented harbour is worse than a plain blue square. Those decisions were the work.

The boring parts are the product. Nobody will notice that the lake is plain. They'd notice immediately if Burlington had a second downtown floating off Rock Point.

Small, resumable jobs. Every step could stop and pick up where it left off: renders in shards, drawing row by row, a reaper that kills forgotten GPUs every half hour. When a GPU disappeared or a download dropped, I lost minutes, not a day.

Go turn the city. If you find something that isn't really there, tell me and I'll redraw it.