DNA, galaxy, torus knot, 3D text: Fable 5.1 + Claude Code morphing a million points
The same shape-morph prompt, run by Fable 5.1 inside Claude Code: 65 turns, 64 tool calls, $4.68. Each of the four iterations records what it fixed — blown-out whites, a torus knot the camera flattened into a figure eight, transitions that looked like uniform fog, and clipping in a narrow viewport.
The on-screen labels are in Chinese: this is the model's verbatim output from an experiment run in Chinese, and editing it would make the artifact something other than what was measured.
How it was made
- Model
- Claude Fable 5.1 + Claude Code
- us.anthropic.claude-fable-5-1
- How
- agent loop
- Claude Code 2.1.266
- Reasoning effort
- high
- Turns
- 65
- Tool calls
- 64
- Output tokens
- 52.5k
- Wall time
- 17m 48s
- Cost
- $4.68
- Artifact
- 598 lines, one file
- Error feedback
- none
The four shapes are a DNA double helix (t=2), a spiral galaxy (t=8), a torus knot (t=14)
and extruded text reading ASTRA (t=20), with transitions at t=5 / 11 / 17 / 23 where the
scatter-and-reassemble is visible. A million particles; the det=1 determinism check
passed three times out of three.
Every one of the four iterations fixed something that could only be found by rendering the frame:
- Everything worked, but additive blending blew out, the DNA washed to white and the dust was too dense. Per-particle brightness went from 0.28 to 0.075.
- At t=14 the camera happened to view the torus knot side-on, flattening it into a figure eight. The knot was rotated 90° about Y and tilted slightly, particles pushed toward the tube wall; since the four shapes differ wildly in density, per-shape brightness compensation was added.
- Transitions looked like uniform fog. Per-particle stagger was raised to 50% and the scatter made more radial and smaller in amplitude, so fragments of both the source and the target shape are visible mid-transition.
- Accent colour ratios were tuned and FOV adaptation added to hold horizontal field of view on narrow viewports, then a final regression pass.
Item 2 is the one that makes the point: “the torus knot reads as a figure eight from this camera angle” is not something a static check can find, and not something a model avoids by thinking harder — it has to draw the frame and see it before it knows to rotate 90°.
Implementation: the four sets of target positions are generated once on the CPU with a
fixed-seed mulberry32 and stored in position / aP1 / aP2 / aP3; the text shape is
drawn to an offscreen Canvas2D, sampled per pixel and extruded, with a fallback for when
the font is missing. Shape index, progress, easing, scatter, noise perturbation, colour
and perspective sizing are all computed in the vertex shader from uTime. Resting states
sit at mean luminance 0.04–0.06 and transitions at 0.09–0.11 — neither a black frame nor
a bloom-washed one.
Controls: drag to orbit, scroll to zoom, space to pause, 1/2/3 for palettes
(including Solar Ember and Deep Ocean), ?t= to stop at any moment.
Same prompt, other runs
three.js r170 is served from this site, so running a demo makes no third-party request. Published by the author as an individual; testing was self-funded and nothing here represents an employer's position.