Frame from Risograph animation of a lone ink dot

Risograph animation of a lone ink dot

A 28-second square animation in a risograph-print look: a lone indigo dot calls out with ripples through 26 code-drawn scenes, finds a pink partner, and ends on a hand-lettered signature. Claude Code built it as one index.html from a 10k-character brief.

“It's a recreation of the idea, not the original.”

1. BriefFull
Build a 30-second procedural animation in a risograph-print style, as ONE self-contained index.html (Canvas 2D, no libraries, no network fonts, no images, no assets of any kind — every pixel is drawn by code). Make the finished animation, not a demo of techniques.

The idea
A lone ink dot calls out into the world with ripples, and everything that resonates answers back — bells, wolves, whales, radios, fireworks. It collects them as memories, but alone they fade to blue. Then a second dot, pink, answers from off-screen. Call and response. Where their ripples meet, a flower blooms, the world is reprinted in their two inks, and we pull back to a universe full of pairs. It ends on a hand-lettered signature.

The spine of the whole piece: a small indigo dot pinned to the exact centre of the frame, and concentric ripple rings coming out of it. Every scene, every transition and every camera move is organised around that dot. It never drifts during Acts I–III.

Format
Square 720×720 canvas (internally render at devicePixelRatio), 28.0 s, time-based (not frame-based).
Warm cream paper background in all "paper" moments.
Music/cuts on a 120 BPM grid: 0.25 s and 0.5 s are the base units.
Timeline
Time (s)	Act	What happens
0.0–1.5	I. The call	Blank cream paper, dot at centre. Two blue ripple rings expand from the dot past the frame edges. Little curved "vibration" tick marks (2–3 short parallel arcs) flick near the rim.
1.5–4.5		Each ripple leaves behind a disc (~55 % of frame width) holding a tiny world, with blank paper + one ripple between each: koi pond with lily pads and concentric water rings → a cricket silhouetted on a big yellow moon (the disc flips in like a coin, its rim thickness visible) → jellyfish in a deep green-blue sea (disc slides in from the right, rotating slightly).
4.5–6.0		A disc opens on the dot and the camera dives through it to full bleed: owl close-up → temple bell ringing (sound arcs) → lighthouse (beam + wave arcs). Each next scene opens as a disc over the previous one, then fills the frame.
6.0–13.9	II. Everything resonates	Montage of full-bleed scenes, hard cuts on the beat, accelerating from ~0.5 s to ~0.25 s per scene. At 6.0, 8.0 and 10.0 it "breathes": back to blank paper for one ripple, then the next scene irises open from the dot. Scene order below.
13.9–15.9		Rewind: earlier scenes flash back in reverse, each in an alternate colourway (inks swapped), framed by a thin pale double "lens" ring around the dot that tightens a little each time.
15.9–17.8	III. Archive	Pull back: all scenes are now ~40 circular medallions on 4 concentric orbits around the dot, like grooves on a record or a solar system, on pale yellow paper, orbits slowly counter-rotating. Then they drain to a single blue ink (cyanotype look), shrink, scatter outward and vanish. Lone dot on paper. One beat of stillness.
17.8–22.0	IV. The answer	A pink halftone glow creeps in from the bottom-left corner; pink ripple arcs roll in from off-screen. The dot answers with a blue ring. The camera eases back and pans to reveal a pink dot bottom-left. Call and response: alternating blue and pink ripples, each a little bolder, the rings drifting closer.
22.0–23.0		Their rings touch: tiny yellow sparks at the contact point, the pink dot gets a yellow core, and a pink halftone lotus with an orange-yellow heart blooms between them and slowly spins, framed by one blue and one pink ring.
23.0–24.0	V. Together	Fast duotone reprise printed in ONLY pink + blue ink: waterfall, whale, rocket launch, ringed planet — with both dots now visible in every frame.
24.0–26.0		Deep indigo night with star grain and nebula haze. The two dots, now with yellow halos, orbit each other inside their own rings. Zoom out: hundreds of other blue/pink pairs, each orbiting inside small rings.
26.0–28.0	VI. Signature	Cream paper. "opus 5" is hand-lettered stroke by stroke in indigo ink with pink misregistration. The two dots sit side by side under it as a "••" mark; the pink dot sends one small ring; "claude" writes itself below. Short hold, then all the lettering dissolves into halftone dots that shrink away.
(Replace "opus 5" / "claude" with your own title.)

Scene library (Act II, in order)
howling wolf on a snowy ridge under aurora · rotary telephone ringing on a pink sunburst · turntable (the dot = the spindle) · frogs croaking under a huge full moon among reeds · bats pouring out of a cave at sunset · breaking ocean wave · cat from behind at a rainy night window, city lights · sunflower with a bumblebee (dot = flower heart) · cathedral valve radio with sound arcs · fireworks over a harbour · hummingbird among morning glories · whistling red kettle against a tiled wall · Ferris wheel at a fairground at dusk · jungle waterfall · bicycle under bougainvillea · whale in shafts of light · grand piano / harp strings with sound arcs · rocket launch from a gantry, billowing clouds · apartment windows at night with a moon · ringed planet · hot-air balloons over hills · volcano with lightning · radio telescope listening to a spiral galaxy · campfire in a dark forest · sunflower field to the horizon · layered mountain ridges at sunrise · lone umbrella pine over furrowed fields at dusk · raindrops on a night pond.

Composition rules for every scene

One bold subject, readable as a silhouette in 0.25 s. Strong value contrast.
The centre dot lands on a meaningful spot (record spindle, bell body, phone dial, sunflower heart, where the howl starts…).
Many scenes contain concentric sound/light/water arcs that rhyme with the ripples.
3–4 inks per scene maximum.
Visual system (risograph)
Paper: warm cream #F2EDE3, subtle fibre grain and faint mottling. Static — never flickers.
Inks (riso standards): Blue #0078BF, Fluorescent Pink #FF48B0, Yellow #FFE800, Green #00A95C, Orange #FF6C2F, Violet #765BA7, Indigo #2E3192 (the dot and the lettering). No pure black: darks come from overprinting inks (multiply).
Halftone: each ink is its own layer. Tones are dot screens with visible dots (~4–6 px pitch), a different screen angle per ink (e.g. 15°, 45°, 75°, 0°). Gradients = dot-size ramps. Solids at 100 %.
Misregistration: each ink layer offset by 1–3 px in a fixed per-scene direction. The centre dot always shows a thin pink fringe on one side.
Print texture: speckle flecks, small ink-starved voids in solids, white hatching for highlights.
Line quality: hand-drawn wobble and stroke-width variation. Ripples are never perfect circles (low-frequency noise on the radius, tapered ends).
The dot: indigo, ~2.2 % of frame width.
Motion vocabulary
Ripple: ring grows from the dot to beyond the frame corner in ~0.6 s (easeOutCubic), thinning and fading; 2–3 tick-mark arcs flick at the rim.
Disc reveal: circular mask grows with a slight overshoot (easeOutBack). Variants: coin flip (scaleX 0→1, ellipse with visible rim thickness in a darker ink), slide-in with a little rotation.
Dive: scale the disc up to full bleed in ~0.35 s (easeInOutCubic); the dot stays centred.
Montage cut: hard cut on the 0.25 / 0.5 s grid. No crossfades between full scenes.
Lens ring: pale double outline around the dot, tightening shot by shot.
Archive pull-back: the current scene shrinks into one medallion, the others appear on their orbits; orbits alternate rotation direction.
Ink drain: each medallion re-rendered as a single blue ink from its luminance, then crossfaded (the only allowed crossfade).
Scatter: medallions move outward (easeInQuad) while shrinking to zero.
Bloom: petals unfold with a stagger (easeOutBack), then slow rotation.
Camera: smooth, critically-damped pans and zooms. No jitter.
Handwriting: single-line glyph paths revealed by stroke progress along their length.
Dissolve: lettering converted to halftone dots that shrink to zero with noise-staggered timing.
Architecture
render(t) is a pure, deterministic function of time: the animation is seekable to any frame.
Seeded PRNG (e.g. mulberry32) per scene and per element. Never call Math.random() inside the render loop. Textures stay attached to their objects.
The timeline is a data array of cues {start, duration, kind, scene, transition, params}, not hard-coded if/else.
Each scene is a module {id, inks, draw(inkCtx, localT, rng)} in a registry.
Riso compositor: draw each ink's coverage into an offscreen greyscale canvas → halftone it with a precomputed threshold tile per screen angle → tint → composite with multiply on the paper, with the registration offset.
Pre-render each scene's static ink layers once (lazily, with a loading bar) into bitmaps. Animate only transforms plus a few small live elements (fire, wings, water arcs, beams). Target 60 fps playback on a laptop.
Hand-lettering: define only the glyphs needed as stroke paths (no font files).
Controls & export
Play/pause (space), replay, scrubber with time readout and act markers, ←/→ to step one frame (1/24 s).
?t=12.5 URL param to open paused on a given time (used for inspection).
"Record" button: canvas.captureStream(24) + MediaRecorder → WebM download.
Optional, muted by default: WebAudio soundtrack at 120 BPM (warm analog pad + soft arpeggio), a soft ping on each ripple, blue and pink pings a minor third apart in Act IV.
Process — do not try to one-shot this
Engine first: paper, riso compositor, dot, ripple, timeline, controls. Stop and show me stills at t = 0.3, 1.8, 3.0 before going further.
Scenes in batches of ~8. After each batch, open each scene with ?t= in a headless browser at 720×720, screenshot it and look at it. Fix muddy, illegible or off-centre compositions before starting the next batch.
Transitions + Acts III–VI.
Full inspection pass: screenshot every 0.25 s around 1.5, 4.5, 6.0, 13.9, 15.9, 17.8, 22.0, 24.0 and 26.0. Fix pops, clipping, flicker, texture swimming, and the dot drifting off centre.
Quality bar: fewer excellent scenes beat many mediocre ones. If you run short on budget, cut Act II scenes — never the transitions or Acts III–VI.

Don't
external assets, libraries, fonts or image generation
photorealism, black outlines everywhere, smooth gradients without halftone
crossfades between full scenes (except the ink drain)
any text other than the final signature
random values that change from frame to frame
2. Follow-up 1
go ahead with the dive and first 8 scenes
3. Follow-up 2
go ahead with the remaining Act II scenes and the rewind

Make it yours. As the creator suggests, swap "opus 5" and "claude" in the signature act for your own title. Rewrite "The idea" paragraph to tell another story in the same riso system.

Make it hereFree runs soon

You'll need

  • A browser to open index.html and record it with its built-in record button
  • Optional: the claude-video skill, if you want to reverse-engineer a brief from another video the same way
How it was made

The creator pasted the original viral post into Claude Code and had the /watch video skill inspect the animation and reverse-engineer a prompt; Claude turned that into this brief, which the creator adjusted slightly. The brief tells Claude not to one-shot it: engine first, then scenes in batches of 8 checked visually. Claude checked its own frames in a headless browser with contact sheets around each transition. The video is a capture from the page's built-in record button, and 20 of the brief's 28 montage scenes made the cut. In the posted video the signature reads "resonance" over "claude", where the published brief has "opus 5".

About 716k output tokens, 43M cached input tokens read, and 1.5M written to cache, on a Claude Max ($100) plan

Posted Sep 16, 2026 · r/ClaudeAI on Reddit · 544 upvotes · 41 comments

Prompt from: Post body, in a code block; the follow-ups are quoted in the post's Process section

The viral riso animation post it recreates (original by Kevin Ngo)

claude-video, the skill with /watch

Look notesby Reference

Risograph-print illustrations on cream paper, organized around a small indigo dot at the center: a koi pond, a turntable, a radio, a satellite dish, a whale, and overlapping pink and blue halftone discs, ending on a hand-lettered signature.

Color
Cream paper with spot inks: indigo, fluorescent pink, teal blue, sunflower yellow, orange, and green, with visible halftone dots and slight misregistration.
Type
No text until the end: a hand-lettered indigo signature with a pink offset, "resonance" over "claude", with a blue and a pink dot between them.
Framing
Square frame with the dot pinned dead center. Scenes sit in circular discs on blank paper or fill the frame full bleed, with concentric ripple rings.
Sound
A pad and arpeggio at 120 BPM plus a ping on every ripple, synthesized with Web Audio in the same file, according to the creator.
Structure
A koi-pond disc, the lone dot with one ring, a turntable, a radio, a satellite dish in a disc, the dot alone on paper, overlapping pink and blue halftone discs, a whale in deep blue, then the hand-lettered signature.

More like this

1:10

Risograph film of a starling murmuration

Claude Code · Canvas 2D

0:29

Claude icons shoot an action movie

Claude Code · Python

1:25

Crayon piano performance with a black cat

Opus 5.5 · Canvas 2D

0:51

Ink-and-watercolour explainer for an app

Claude Code · Plain JavaScript

0:16

Clawd plants a seed: a watercolour cartoon

Claude Code · ClaudeAnimationBase

0:30

Four seasons past a cozy train window

Claude Code

0:51

Paper-collage explainer for an events app

Claude Code · Plain JavaScript

2:38

Five thousand years of China in line art

Claude Code · SVG

1:00

Hand-drawn collage on the purpose of life

Claude Code · Plain JavaScript

0:18

Pelican test extended into a cartoon gag

GPT-6 Astra · SVG

0:52

Hand-drawn collage of a startup's story

Opus 5.5 · Plain JavaScript

3:55

Ink-wash animation of a tadpole story

Opus 5.5 · HTML and CSS

1:48

Origami doodle story from humanity to AI

Partial prompt · Opus 5.5 · Plain JavaScript

0:39

Paper collage asking the purpose of life

Opus 5.5 · Plain JavaScript

0:06

Paper-cutout garden with stop-motion holds

HyperFrames

0:30

Negroni recipe as a 30-second explainer

Claude Code · HTML

1:37

Shader universe grown from one typed word

Claude Code · Three.js

2:22

Claude Pop music video, remade overnight

Opus 5.5

1:20

Gold mosaic whose tiles fly as flocks

Opus 5.5 · WebGL2

0:43

Demoscene film from a single HTML file

Claude Code · WebGL2

1:00

The First Spark, a black-ink short film

Claude.ai · Canvas 2D

0:10

Pixel-block logo built by four cursors

Claude Code · Remotion

0:08

Low-poly horse loop across GPT-6.1 levels

GPT-6.1 Sol · Three.js

0:24

Speaker carousel promo for UDC 2026

Partial prompt · Opus 5.5 · Adobe After Effects

2:00

Ethereum history as a documentary trailer

Opus 5.5

2:00

1,000 matplotlib plots cut to techno

Partial prompt · Opus 5.5 · matplotlib

0:29

Apple-keynote film for a photo-print app

Opus 5.5 · HTML and CSS

0:20

Street-poster kinetic type identity bumper

Opus 5.5 · HTML and CSS

0:08

Low-poly 3D horse at five effort levels

Cursor · Three.js

0:14

One morphing UI shape on a 120 BPM beat

Opus 5.5 · HTML and CSS