The gates are open: a Marathon fan project in three days

How I built Tau Ceti IV, a three.js map explorer for Bungie's Marathon with a Suno soundtrack, in three days with Claude Code, and why taste can lead a project now, not just technical ability.

7 min read
In this article · 7 sections

On 2 June 2026 I started an empty repository at 11:24. By 14:08 the same afternoon, it held a working 3D explorer for the maps of Bungie's Marathon. By 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.

It's a fan project. Nobody paid for it and nobody asked for it, but it's the clearest example I have of how my work has changed.

The build recreated layer by layer on the same camera path, from blockout to polish, then the live site. Each layer matches a real commit. Sound on: the track is one of the six made in Suno.

The world that started it

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.

There's already a surface-data explorer for the colony's three zones at tauceti.world, a wireframe map of Perimeter, Dire Marsh and Outpost. I loved the idea, but it leaned on a heavy glow that didn't feel like the game to me. So I wanted to see the same maps in Marathon's own language, with the things that would make it feel alive: who's moving across the map, where the hot zones are, and something to listen to while you look around.

How this used to go

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 the studies on my three.js page. The technical side of a project like this has never been the hard part. The hard part was always the hours.

Every idea went through the same filter. A three.js scene is a weekend, but a scene with a simulation layer, a responsive HUD, performance tiers for weak laptops and a custom soundtrack is weeks of evenings, so I'd cut it down to whatever I could finish. The cutting happened before I'd written a line, which meant the version in my head and the version I shipped were never the same thing.

Client work had the same ceiling with a budget attached. The experience was there, but time and money decided the scope, and polish was always the first thing to go. That ceiling was artificial. It was never about what I could build. It was about what I could afford to build.

What changed

This time I didn't cut anything. I built it with 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 my job became deciding what the explorer should be and saying no to the parts that weren't right.

The film above rebuilds the explorer a layer at a time on one camera path, and each layer matches a commit:

  • Blockout. A camera rig, the world bounds and every point of interest as a grey box. That's space and motion before any 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, the markers become field tags, and the region labels take the game's display face.
  • Bloom and hot zones, nine minutes later. More on that below.
  • HUD, at 19:48. A compass strip, layer legend, map intel, minimaps and zoom, which 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. That covers the soundtrack, the magnetic cursor, loading screens and adaptive quality for weaker GPUs.

That's nineteen commits and about 5,200 lines of TypeScript and CSS in total.

The three.js part

The explorer runs on three.js through React Three Fiber, which lets you write a three.js scene as React components. The map is nothing but lines, so it lives or dies on how the lines look. Each map is one lineSegments mesh with a small custom shader that colours every line by its height. Ground contours sit in a deep survey blue, and structures brighten towards a signal blue as they rise. Additive blending makes the dense areas glow on their own, so that effect costs nothing.

WebGL draws lines one pixel wide, whatever width you ask for. The Marathon rebrand went in flat with no bloom at all, because the game's look is a screen print rather than a glow. Nine minutes later I put a restrained bloom back, because flat was right in principle but one-pixel lines had no weight. A low-intensity bloom with a high brightness threshold gives them body without washing out the dense structure. That's a call you only make by looking, and it took nine minutes rather than an evening because the gap between noticing and fixing had almost closed.

Performance needed the same kind of judgement. The scene is full-screen additive wireframe plus bloom, redrawn every frame because the camera never stops orbiting, so a base M1 Mac at full Retina resolution dropped to about 20 frames a second. The cost grows with the square of the device pixel ratio, so the fix is three quality tiers that scale it. A performance monitor steps down a tier below about 40 frames a second and steps back up when the framerate holds, and the settled tier is remembered for the next visit.

The contacts layer started with taking the original apart. Its moving squads looked like AI, but they're a scripted diorama: paths authored as curves, with state changes on timelines. That made them reproducible, so the contacts layer is a small state machine with a director on top, unit-tested on its own and kept separate from the rendering. Crews of three runners, each a different class, walk the authored routes while UESC patrols loop near their regions. When the two meet, both flip to combat red, and the crew either falls or breaks contact and extracts.

The soundtrack

The soundtrack has six tracks, named after places and names from Marathon's world: Tau Ceti IV, Lh'owon, Pfhor, S'pht, Jjaro and Rook's Theme. I made all six in Suno. The player at the bottom of the screen loads them lazily, so the music never delays the map.

This is the part I'd have cut first, every time. A soundtrack isn't engineering and it's never on the critical path, so under the old filter it didn't survive the first round. But it changes how the explorer feels more than any shader does. With Suno, the question stopped being whether I could make music and became whether a track belonged in this world, which is a taste question rather than a technical one.

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 the frame rate problem was pixel fill before measuring it. Technical depth makes the judging faster, so it compounds with taste instead of competing with it. The difference is that it 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, and 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.

  1. 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.

  2. 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.

  3. 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.

  4. three.js

    three.js · Checked 2026-10-09 · Primary source

    three.js is the JavaScript 3D library the explorer renders with.

  5. React Three Fiber introduction

    Poimandres · Checked 2026-10-09 · Primary source

    React Three Fiber describes itself as a React renderer for three.js.

  6. Suno

    Suno · Checked 2026-10-09 · Primary source

    Suno is the AI music tool used to make all six tracks in the soundtrack.

  7. 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.

People and organisations mentioned

Work with me

What are you working on?

Is there an idea you've shelved because the hours never added up? Tell me what it is, and I'll tell you how I'd build it.

Start a project with me ↗
Doug SilkstoneFounder, builder & operator

I work across engineering, product, analytics and growth. These articles draw on the products I build and the work I do with clients.

About me · More articles by Doug