Game of Life, twice
The same cellular automaton built by two assistants, compared feature by feature.
One cellular automaton, two assistants
Conway’s Game of Life is the classic test for a coding assistant: the rules fit in a sentence, yet a good simulator needs careful data structures, a responsive canvas, an editing model and a lot of design judgment. Two versions were built on The Late Build, one with ChatGPT and one with Claude, and both are complete web apps. They are listed together here so you can see how two assistants approach the same brief when they are given room to be ambitious. Neither is declared the winner, and the comparison below sticks to what is verifiable in the code and the project notes.
Which is which? The ChatGPT version is a React application built from a hosted full-stack starter and published on ChatGPT’s site hosting. It is the one listed as a single-player simulation in the Nodal Play library. The Claude version is a single self-contained HTML file with no dependencies and no build step needed to run it, designed to be published as a Claude artifact or opened straight from a file.
The rules, for readers who need them: a live cell with fewer than two live neighbors dies, with two or three it survives, with more than three it dies, and a dead cell with exactly three live neighbors becomes alive. Four rules, an infinite grid and nothing else produce gliders that walk, guns that fire forever and machines complex enough to run any computation.
The Claude version

The Claude version treats Life as something to explain as well as to run. The landing page is a short essay with an animated rules panel that steps through underpopulation, survival, overpopulation and birth, then a button into the simulator. Under the hood it is an exactness-first design.
Engine
- Unbounded universe. Cells live in 32 by 32 chunks held in a map, each chunk a set of 32 unsigned integers with one bit per cell. Empty chunks are deleted, so an empty universe costs nothing.
- Bit-parallel steps. A generation is computed 32 cells at a time using bit-plane arithmetic for the neighbor count. The rule is mask-driven rather than hard-coded, so any birth-and-survival rulestring runs at the same speed, with a fast path for Conway’s rule. Rules that would make every empty square alive in one step are rejected with an explanation instead of hanging.
- Exact chunk pruning. Only populated chunks and the neighbors that could actually gain a cell are visited. A lone glider wakes two or three chunks instead of eight, which roughly tripled throughput once a gun had scattered gliders across the plane.
- Speed. The landing page advertises up to 4,096 generations per second. There is an optional torus mode on a multiple of 32 cells.
Catalogue and measurement
The simulator ships with 1,256 patterns from the LifeWiki collection as bundled in an MIT-licensed open-source repository. The interesting part is that classification, period, speed, displacement, bounding box and population were not copied from the source files. Every pattern was simulated until it cycled, died or ran out of budget, and the measured result was recorded. That is why a pattern’s stated period always matches what you see when you run it, and why a glider reads as c/4 diagonal with period 4, a lightweight spaceship as c/2 with period 4 and a copperhead as c/10 with period 10. Forty-six patterns need a rule other than Conway’s, and the catalogue flags them and offers to switch.
Interface

- Four tools, and the left button always belongs to the active one: Draw (freehand plus line, rectangle, circle and triangle), Select, Pan and Pattern. Right-click pastes, and right-drag moves the last shape.
- Exclusive-or placement. Stamping a pattern twice in the same place erases it, which is the convention of pattern editors in the Life community, and it makes placement reversible.
- Undo and rewind. Forty-deep undo for edits and a rewind buffer of up to 400 generations. The notes stress that rewind replays recorded states; Life is not reversible, and the interface says so.
- Age shading and trails. Newly born cells fade from a highlight color into the live color over a chosen number of generations, so spaceships drag comet tails. Ages are computed per frame from a ring of recent chunk bitmaps rather than stored per cell.
- Import and export in RLE, so anything exported opens in Golly or LifeViewer and anything from LifeWiki opens here. Plain text grids are also accepted.
- Themes. Fourteen palettes plus Auto and Custom, light and dark host themes, and a shareable theme code that packs six colors into 24 characters.
- Mobile. An opt-in mobile layout with a floating rail, a bottom zoom bar measured in cells across the viewport, and pinch to zoom and pan.
Testing
The engine and shape code live in a file with no DOM dependency so they can be tested in Node. The suite has 77 assertions comparing the engine against a naive reference implementation, including random soups, torus wrapping and shape geometry. The README also keeps a numbered list of bugs already found and fixed, headed with a warning to read it before editing. One bug came from a JavaScript string-replacement trap: the dollar sign is the row separator in the pattern format and also special in replacement strings, so the build now uses function-form replacements and asserts every placeholder was filled.
The ChatGPT version

The ChatGPT version is a React single-page app with a more dashboard-like feel. Its subtitle is “Cellular automated research workspace,” and the layout reflects that: tools on the left, the plane in the center, an inspector with four tabs on the right and a playback bar below.
- Sparse unbounded plane. Live cells are stored in a set keyed by coordinates, with an active-cell safety cap of 250,000 cells so a runaway pattern cannot freeze the page.
- Nine tools: Paint, Erase, Pan, Inspect (click a cell for its coordinate, state and live-neighbor count), Line, Square, Circle, Select and Stamp pattern. Select copies automatically, and right-click pastes.
- Five rule presets: Conway’s Life, HighLife, Seeds, Day and Night and Life without Death, each with a one-line description.
- Patterns. A small hand-curated library (glider, blinker, beacon, pulsar, Gosper gun, lightweight spaceship and others) with authors and descriptions, plus a searchable external catalogue of RLE files fetched from the same open-source collection at runtime, with a preview before stamping.
- Playback. Speed from 1 to 60 generations per second with a multiplier of up to 100, capped at 1,000 per second, a live readout of update frames per second and generations per second, a step button and step-back through a history of 120 generations.
- Camera. Zoom from 0.025 to 90 pixels per cell, plus an Edit view panel that rotates the plane by up to 35 degrees and tilts it up to 62 degrees for a perspective view. The grid coordinates stay two-dimensional.
- Appearance. Dark, light, blue, green, purple and custom themes, an adaptive grid and birth-age coloring.
- Import and export. JSON (cells, rule, generation and camera) and RLE import.
- Tooltips everywhere. Nearly every control explains itself.
It ships with a rendering smoke test that server-renders the page and checks the markup.
Side by side
| Claude version | ChatGPT version | |
|---|---|---|
| Delivery | One HTML file, no dependencies, works from a file | React app on a hosted starter, runs on the web |
| Engine | Chunked bit-parallel, up to 4,096 gen/s advertised | Sparse cell set, up to 1,000 gen/s target |
| Rules | Any B/S rulestring, B0 rejected | Five presets |
| Patterns | 1,256 built in, measured and searchable offline | A small built-in set plus a runtime-fetched catalogue |
| Editing | 4 tools, XOR placement, shapes, move last shape, 40-deep undo, 400-step rewind | 9 tools, inspect, 120-step history |
| View | Sharp and density rasterizers, trails, grid decades | Rotation and tilt, adaptive grid |
| Themes | 14 palettes, custom, shareable code | 6 themes including custom |
| Mobile | Dedicated layout with pinch | Responsive with a settings sheet |
| Tests | 77 engine and shape assertions | Server-render smoke test |
| Safety limits | Chunk-budgeted trails, rejected rules | 250,000-cell cap |
What the comparison teaches
Specification beats model
The biggest differences come from the briefs, not from the models. The Claude version was driven by a long list of requirements (exact engine, measured catalogue, themes, mobile, no network) and an agent that tested against a reference. The ChatGPT version was driven toward a workspace feel with a strong inspector and a rotation and tilt view. If you prompt an assistant for a polished dashboard you will probably get one; if you prompt for exactness and tests you will probably get those instead.
Hosted starter or single file?
A hosted starter gives you routing, server rendering and a path to storage, but it brings dependencies and a build. A single file travels anywhere and survives a browser tab from a decade ago. For a simulation with no backend, the single file was the cleaner deliverable; for something that wants accounts or shared data, the starter has a head start.
Runtime network use
The ChatGPT version fetches its larger pattern list from a public repository when you open the catalogue; the Claude version bundles everything, so it never touches the network. That affects privacy, speed and what happens when a service goes down.
Documentation as memory
The Claude version has a file map, a build explanation and a bug list. That is what let later agent sessions make changes without breaking exactness. See The vibe-coding workflow for the broader practice.
Try them and keep going
The ChatGPT version is reachable from the Nodal Play library. The Claude version was built as a standalone page and artifact. Both appear in the projects list, and both were discussed on stream; check the socials page for the dated recordings. For a different kind of web tool built the same way, see Celebrity Explorer.