
NOTE
This post and codecity were created collaboratively with Claude. Thalida designed the vision, the world, and the rules that turn a repo into a city; Claude helped with implementation, architecture, and writing this post.
What It Is
codecity turns any git repo into a 3D city. It walks the file tree and the git history and builds a world out of them:
| In the repo | In the city |
|---|---|
| A directory | A street, widened by what it holds |
| A file | A building, floors stacked by line count |
| A file’s type | The facade — CSS, TS, an image, a waveform |
| A file’s age | How faded and weathered the building looks |
| A commit | A tree |
| An author | A firefly, orbiting their commit tree |
Open any public repo at codecity.io, or see the local dev setup to run it against your own private and local repos.
The Timeline
I came up with this idea many many years ago, and finally, via the power of AI, was able to properly bring it to reality.
NOTE
Every milestone below links to that exact commit rendered in codecity.
Act One: The Early Years
The early versions live in codecity-legacy.
| When | Milestone |
|---|---|
| Nov 2021 | It’s a real city Eight days from a commit called “well fuck it works?” to a rendered city with a first-person camera, skybox and fog. A Python API read the repo with gitpython; the browser drew what came back. See this commit as a city → ![]() |
| Jun 2022 | Rewritten in A-Frame Rendering moves to A-Frame, the build to Vite, and the roads get a new layout algorithm. Four commits, then two years of silence. See this commit as a city → |
| Jan 2024 | Streaming, and a framework carousel FastAPI and pydantic, streaming responses over websockets and workers. The frontend went Remix, then React out, then Svelte — in three days. Tile-based rendering, real revision stats. Then it stopped. See this commit as a city → |
| Jan 2026 | “re-re-start” A reset, a Django rewrite, a devcontainer, RabbitMQ and an architecture doc. Abandoned two days later. See this commit as a city → |
Act Two: The Rebuild
A fresh repo, thalida/codecity, started 18 April 2026.
| When | Milestone |
|---|---|
| 18 Apr 2026 | The first city A filesystem scanner, an isometric renderer and a street-tier layout — all on day one. See this commit as a city → ![]() |
| 19 Apr 2026 | One file, one skyscraper The renderer moves to Three.js and buildings become stacks of fixed-size floor units — so a single long file towers over the whole city. The scanner is rewritten in Python the same day: 82s → 6s. See this commit as a city → ![]() |
| 12 May 2026 | Three packers before one worked Streets collided and subtrees overlapped each other. A v3 mirror-variant packer, then a V4 global-occupancy packer with bounded phantom spacing. See this commit as a city → ![]() |
| 14 May 2026 | Buildings that say what they are A procedural facade shader writes each file’s type onto its face, one mesh per directory. Then the lighting lands: directional sun, HDR bloom, age-driven decay, ground haze. See this commit as a city → ![]() |
| 19 May 2026 | Built for Linux-scale Blobless clones, an NDJSON streaming manifest and cell-based rendering — so a 90,000-file repo draws instead of dying. See this commit as a city → ![]() |
| 23 May 2026 | The city gets an island A floating island world plane, with sky, ground and foliage. And commit-driven trees: every commit in the history plants one. See this commit as a city → ![]() |
| 28 May 2026 | Every author becomes a firefly One orb per author on each commit, co-authors included, orbiting their commit tree. Hover a tree to read the commit that grew it. See this commit as a city → ![]() |
| 19 Jun 2026 | Rebuilt underneath Preact and signals on the front, FastAPI on the back, and a layout worker about ten times faster. A month of work with nothing to show for it. See this commit as a city → |
| 24 Jul 2026 | Scrub the history, watch it grow Drag through the commit log and the city rebuilds at each commit — each commit’s own content, with deleted files marked by a cross on the roof. See this commit as a city → ![]() |
| 8 Aug 2026 | codecity.io Shipped from a tagged release. Cold load cut from about three minutes to twenty-five seconds, with a Discover list and a live city rendering behind the landing page. See this commit as a city → ![]() |
Design
Inspiration
Paper Sketches
The rules I drew in 2021 are, more or less, the rules that shipped: streets are folders, street width follows what’s nested inside, and a building ages with the file it stands for.
| --- | --- |
|---|---|
![]() | ![]() |
![]() |
How It’s Made
Frameworks, Tools, and Services
- Rendering: Three.js with a procedural facade shader
- Frontend: Preact + signals, TypeScript, Vite
- Backend: Python, FastAPI, pydantic, SSE
- Packaging: A single Docker image on
GHCR —
docker run ghcr.io/thalida/codecity - Hosting: codecity.io
AI Collaborators
Every commit was written in collaboration with Claude.
| Model | Commits | Span |
|---|---|---|
| Claude Opus 4.6 (1M context) | 12 | 18 Apr 2026 |
| Claude Sonnet 4.6 | 31 | Apr – Jun 2026 |
| Claude Opus 4.7 (1M context) | 126 | Apr – Jun 2026 |
| Claude Opus 4.8 (1M context) | 52 | Jun – Jul 2026 |
| Claude Fable 5 | 10 | Jun – Aug 2026 |
| Claude Sonnet 5 (1M context) | 1 | 20 Jul 2026 |
| Claude Opus 5 (1M context) | 39 | Jul – Aug 2026 |
The one AI-assisted commit in the legacy repo — January 2026, right before the rebuild — was co-authored with Claude Opus 4.5.












