At 11:24 on 2 June 2026, I opened an empty repository. By 14:08, it held a working 3D explorer for the maps of Bungie's Marathon. At 08:38 on 4 June, it had a squad simulation, adaptive rendering, a soundtrack and a design language borrowed from the game. It's live at marathon.withseismic.com.
Nobody asked for it or paid for it. It's a fan project, but it's the clearest example I have of how my work has changed.
The map I wanted to build
Marathon is Bungie's extraction shooter, set on a lost colony called Tau Ceti IV. Its visual identity is one of the strongest in games right now: white on black, a single acid lime, electric blue and type that looks printed on a field manual.
The colony's three zones already had a surface-data explorer at tauceti.world: a wireframe map of Perimeter, Dire Marsh and Outpost. I loved the idea, but its heavy glow didn't feel like the game to me. I wanted to see the same maps in Marathon's own language, with people moving across them, hot zones to watch and something to listen to while looking around.
The hours used to set the scope
I've built games and interactive 3D work for most of my career, from a studio that shipped five games to a million players to three.js studies of my own. The technical side of a project like this was never the hard part. The hours were.
A three.js scene is a weekend. Add a simulation layer, a responsive HUD, performance tiers for weak laptops and a custom soundtrack, and it's weeks of evenings. So I used to cut ideas down before writing a line. The version I shipped was never the version in my head.
Client work had the same ceiling with a budget attached. I had the experience, but time and money set the scope, and polish went first. That ceiling was about what I could afford to build, not what I could build.
What changed
This time I didn't cut anything. I used Claude Code, an agentic coding tool that reads the codebase, edits files and runs commands from the terminal. Claude did most of the typing, so I could decide what the explorer should be and reject the parts that weren't right.
The film follows one camera path through the build. Each layer matches a commit:
- Blockout. A camera rig, world bounds and every point of interest as a grey box. Space and motion came before art.
- Geometry, at 14:08 on day one. Each map's line data, around 20 MB of it, is decoded in chunks and drawn as a single set of line segments.
- Marathon language, at 18:27. The palette flips to white on black with sparing lime and blue, markers become field tags, and region labels take the game's display face.
- Bloom and hot zones, nine minutes later. The flat lines needed weight.
- HUD, at 19:48. A compass strip, layer legend, map intel, minimaps and zoom scale from a phone held upright to an ultrawide monitor.
- Contacts, on day two. Runner crews and UESC patrols walk the map, fight, fall and extract.
- Polish, on the morning of day three. The soundtrack, magnetic cursor, loading screens and adaptive quality for weaker GPUs.
Nineteen commits. About 5,200 lines of TypeScript and CSS.
The three.js part
The explorer runs on three.js through
React Three Fiber, which lets me write a three.js scene as React components. The map is nothing but lines, so their appearance carries the scene. Each map is one
lineSegments mesh. A small custom shader colours every line by height: ground contours sit in deep survey blue, while structures brighten towards signal blue as they rise. Additive blending makes dense areas glow on their own, so that effect costs nothing.
WebGL draws lines one pixel wide, whatever width you ask for. I first applied the Marathon rebrand with no bloom: the game's look is closer to a screen print than a glow. Flat was right in principle, but the one-pixel lines had no weight, so nine minutes later I put restrained bloom back. Low intensity and a high brightness threshold gave the lines body without washing out the dense structure. I had to look at the result to make that call. Noticing and fixing it took nine minutes rather than an evening.
The full-screen additive wireframe and bloom redraw every frame because the camera never stops orbiting. On a base M1 Mac at full Retina resolution, the scene dropped to about 20 frames a second. The cost grows with the square of the device pixel ratio, so I added three quality tiers that scale it. A performance monitor steps down below about 40 frames a second and steps back up when the framerate holds. It remembers the settled tier for the next visit.
I started the contacts layer by taking the original apart. Its moving squads looked like AI, but they were a scripted diorama: paths authored as curves, with state changes on timelines. That made them reproducible. I built a small state machine with a director on top, unit-tested on its own and kept separate from rendering. Crews of three runners, each a different class, walk the authored routes while UESC patrols loop near their regions. When they meet, both flip to combat red. The crew either falls or breaks contact and extracts.
The soundtrack
I made all six soundtrack tracks in Suno. They're named after places and names from Marathon's world: Tau Ceti IV, Lh'owon, Pfhor, S'pht, Jjaro and Rook's Theme. The player at the bottom of the screen loads them lazily, so music never delays the map.
Under my old time filter, I'd have cut the soundtrack first. It isn't engineering or on the critical path, but it changes how the explorer feels more than any shader. Suno shifted my decision from whether I could make music to whether a track belonged in this world. That was a question of taste.
Taste leads now
When building gets cheap, the bottleneck moves. It used to be technical ability multiplied by hours. Now it's knowing what good looks like and noticing when something's off. Claude can write a bloom pass, but it can't decide that the lines need weight without glow, or that Outpost should open zoomed in on extraction point five rather than showing the whole map. Those calls came from looking hard at the game and caring about getting it right.
Experience still counts, but it counts differently. I knew bloom was the lever for line weight, and I suspected pixel fill was behind the frame rate problem before measuring it. Technical depth makes the judging faster, so it compounds with taste instead of competing with it. It just isn't a gate any more. The gates are open, so what gets built is limited by what you can imagine and what you're willing to throw away.
Credits
Tau Ceti IV is an independent fan project, and it isn't affiliated with Bungie. The map geometry and point data come from the original explorer at tauceti.world. The new work is everything layered on top of them. Marathon, its world and its names belong to Bungie.
Research and sources
Checked 2026-10-09. Next review: 2027-04-09. Listings and availability can change.
Tau Ceti IV // Surface Data
WithSeismic · Checked 2026-10-09 · Primary source
The finished explorer, live with all three maps, the contacts layer and the music player.
Marathon
Bungie · Checked 2026-10-09 · Primary source
Marathon is Bungie's PvPvE survival extraction shooter, set on the derelict colony of Tau Ceti IV.
Tau Ceti IV // Surface Data
Tau Ceti World · Checked 2026-10-09 · Primary source
The original surface-data explorer for Perimeter, Dire Marsh and Outpost, which supplied the map geometry and point data.
three.js
three.js · Checked 2026-10-09 · Primary source
three.js is the JavaScript 3D library the explorer renders with.
React Three Fiber introduction
Poimandres · Checked 2026-10-09 · Primary source
React Three Fiber describes itself as a React renderer for three.js.
Suno
Suno · Checked 2026-10-09 · Primary source
Suno is the AI music tool used to make all six tracks in the soundtrack.
Claude Code overview
Anthropic · Checked 2026-10-09 · Primary source
Claude Code is an agentic coding tool that reads a codebase, edits files and runs commands.


