NOLAN'S INVENTION

Dusty.

The crumb-eating robot that knows where the edge is.

Below: spin Dusty in 3D and take it apart, then see exactly how the movie was made.

EXPLORE IN 3D

Dusty.

Drag to spin. Tap a system, explode it, or cut it open.

0:00
Loading Dusty...

How we made Dusty's movie

Everything in the movie is built from code, starting from the same CAD model we 3D print Dusty from. No animation software, no stock models, no video editor. Here is the whole recipe, with the tools, so you can make one for your own project.

The tools

AI partnerClaude (Anthropic), in a chat that can run commands on our own computers. It wrote the scene, the animation, the sound and the render scripts, and checked its own work by rendering test frames and looking at them.
CADPython with manifold3d. Every printed part is a program, so a design change rebuilds every part.
3D on the webthree.js 0.170: physical materials, filmic tone mapping, soft shadows, a bloom filter for the LED eyes.
3D filetrimesh exports the assembly as one GLB (0.6 MB), every part tagged with its system.
VoiceElevenLabs text-to-speech, model eleven_v3. The kitchen scenes use the stock voice "George". The breakdown is Nolan himself: an ElevenLabs clone of his voice made from recordings of him talking. 15 clips, about 2,000 characters.
Music and sound effectsSynthesized from math in Python (NumPy and SciPy). No samples.
Mixing and encodingA Python mixer, then ffmpeg (H.264 video, AAC audio).
RenderingHeadless Chromium driven by Playwright, on a NVIDIA DGX Spark.
HostingNext.js on Vercel, the same site as the rest of NAW Games.

The recipe

1

Start from the real CAD

assemble.py places every printed part where it sits on the real robot and adds the bought parts (N20 motors, micro:bit, moto:bit, power bank, QTR-1A sensors). export_glb.py turns that into one GLB file in meters, Y up, with each part named system__part (brain, power, drive, sensors, sweeper, tray). Those names are what let the movie light up one system at a time.

2

Build the set out of code

The kitchen is shapes and formulas: an extruded counter with a sink cut out, a lathe-turned mug, a tube-bent faucet, a crinkled foil chip bag, and the crumbs as instanced meshes. Textures (quartz, subway tile, wood floor, the made-up "Crunchies" label) are painted on a canvas by the page itself. A fixed random seed puts every crumb in the same place every time.

3

Make the whole movie a function of time

This is the key trick. Give the page any time, say 36.4 seconds, and it can draw exactly that frame: where Dusty is, which crumbs are eaten, what the eyes show, where the camera is. Dusty's path is a spline through lawnmower rows. The page tests every crumb against the roller along that path and only keeps crumbs Dusty will really reach, so the counter truly ends up clean. The edge stop uses the design numbers: the sensor tip crosses the edge by 3 mm, then it stops.

4

Light it

A warm spotlight under the cabinet, cool moonlight, a room light so the floor shows below the edge, and reflections from an environment map. ACES filmic tone mapping keeps bright areas from blowing out, and the bloom filter only catches things brighter than white, which is just the red LEDs.

5

Write and record the narration

The script is 15 short lines, each written for one moment and timed to fit its window. ElevenLabs eleven_v3 understands tags like [whispers], [tense] and [relieved], which gave the nature-documentary feel. Halfway through, the narrator hands off to Nolan, the inventor and chief engineer, who explains how each system works in his own (cloned) voice. Each line is its own file, so one line can be redone without touching the rest. Where a line ran long, the movie was retimed to fit the voice.

6

Make the music and sound effects from math

The pizzicato strings are the Karplus-Strong algorithm (a burst of noise in a short delay loop that rings like a plucked string). The marimba is decaying sine waves. The synth pads are detuned sawtooth waves through a low-pass filter. The motor whir, crumb crunch, beeps, whooshes and fridge hum are filtered noise and tones. Two cues: sneaky D minor for the kitchen, bright C major for the breakdown.

7

Mix it

Every clip and effect is placed on one 134-second timeline. The music ducks about 7 dB whenever someone talks, using the voice's own loudness as the trigger, then a soft limiter levels the whole thing. The web copy of the audio is 48 kbps mono, 0.8 MB.

8

Render every frame on a GPU

A script opens the page in headless Chromium, steps time forward 1/60 of a second at a time, and saves each frame, captions included. Four copies run at once, each on a quarter of the movie. Then ffmpeg joins the 8,052 frames with the soundtrack.

MachineNVIDIA DGX Spark
ChipNVIDIA GB10 Grace Blackwell superchip
CPU20 Arm cores: 10 Cortex-X925 + 10 Cortex-A725
Memory128 GB unified (shared by CPU and GPU)
GPU pathChromium + ANGLE on Vulkan, NVIDIA driver 580
SoftwareUbuntu 24.04, Playwright 1.58, ffmpeg 6.1
Speedabout 60 ms per 720p frame on the GPU, versus 1.2 s on a 4-core cloud server with software rendering
Full movie8,052 frames at 1920x1080, 60 fps, rendered in under a minute, encoded in about a minute
9

Publish

The master file is 56 MB. The web copy is 28 MB, with the index moved to the front so it starts playing before it finishes downloading. The share picture is a still rendered from the same scene with the title added in Python. Change anything, push the page, and one command re-renders the movie from the live site.

Try it yourself

You don't need a GPU to start. Any three.js scene can be made a function of time and screen-recorded. The render step is where a GPU pays off: it turned hours of rendering into under a minute. The parts that took the most care were not technical: writing narration that fits its moment, and choosing camera angles that show the one thing each scene is about.

DONE

  • Real CAD, Rev A.6
  • Kitchen scene and story
  • System-by-system breakdown
  • Narration, music, sound effects
  • 1080p60 render

NEXT

  • Nolan's own LED faces
  • Narration in Nolan's voice
  • Real stopping distances after the Oct 10 test
← Back to Dusty