Animation that looks printed, frame by frame, on a stencil duplicator: two or three translucent spot inks overprinted on warm paper, halftone dots, ink grain, and plates that never quite line up. References (grammar only): Tom Haugomat's riso illustrations (colour fields and silhouettes, a small figure in a large world, extra colours made by overprinting); Jacques Tati's Jour de fête (comedy staged small in a wide frame, everyday sounds as rhythm); real riso prints (translucent inks, misregistration, pinholes, feed streaks). Copy none of their characters, compositions or palettes.
A risograph prints one colour at a time: each colour is its own stencil ("plate") with its own drum of translucent ink. That one fact makes the look:
- A tiny palette: 2–3 spot inks on warm off-white paper.
- Overprint mixing: inks multiply, so two inks make a third colour and all three approach black; a tint of one ink over a solid of another gives the brightest mixes.
- Misregistration: every plate lands a few pixels off; edges show slivers of paper or a coloured halo.
- Halftone dots for mid-tones, each plate on its own screen angle; imperfect ink: pinholes in solids, streaks along the feed direction, blotchy density.
- Flat shapes, no outlines: forms are colour fields and silhouettes.
Not flat vector art with a noise overlay (every colour comes from the plates), not CMYK pop-art halftone (no process colours, no keyline), not screen-print posters (riso ink is translucent and grainy, not opaque). Never show the RISO brand, logo or machine trade dress; ink names are colour references only.
Pipeline. Draw each frame into one RGB canvas where each channel is one plate's density (R = ink 1, G = ink 2, B = ink 3; 0 = none, 1 = solid). source-over gives true knockouts; globalCompositeOperation = 'lighter' adds ink only to the channels you set: a true overprint. A WebGL2 shader "prints" it:
- per plate: offset in px + tiny rotation → misregistration;
- halftone: cosine spot function on a rotated grid, period ~6–8 px at 1080p, anti-aliased threshold; densities ≥ ~0.9 print solid; screen angles ≥ 15° apart;
- grain on the dot threshold, pinholes in solids, density varying with a feed-direction streak and a slow blot noise;
- composite
paper × Π mix(1, ink_i, coverage_i), with faint paper fibre; - dots anchored to the paper (screen), not to objects: a pan slides the image under a fixed screen, as if each frame were printed anew;
- a per-plate gate and a roller sweep (moving edge, slightly heavier ink band) let a plate arrive mid-shot.
Composition rules.
- Every area uses at most two plates, at most one of them as a tint. Three halftones on top of each other = mud.
- Big flat shapes, lots of solid paper and solid ink; halftone in a few stepped bands (e.g. 20 / 40 / 60 / 100 %) for skies, shadows, distance.
- Characters get a paper-white knockout halo (4–5 px): stamp their layer in a ring with
filter: brightness(0)(zero ink = paper), then draw them. Plates misregister around it, so it picks up coloured fringes like a real trap. - One horizon, one big flat field or disc, one small figure; the figure's head against the flattest colour in the frame.
- Design for the one-plate version: every main colour contains some of the first plate, so a one-ink frame still reads as a complete silhouette. A deliberate exception stays blank paper until its plate arrives: a reveal.
- 2–3 spot inks, never more, plus paper; every other colour is an overprint or a tint. No gradients except stepped halftone.
- Pick inks whose pairs mix into useful colours; at least one must carry a silhouette alone.
- Paper is warm off-white (around
#F4EEE2), never pure white; paper white is a colour too (knockouts, highlights, subtitles). - Light neutral surfaces (skin): a light tint of the palest ink. Dots of a saturated ink on skin look like a rash.
- Save the full overprint (every plate, densest mixes) for the moment that earns it.
- Example ink sets: Blue
#0078BF+ Yellow#FFE800+ Fluorescent Pink#FF48B0; Teal#00838A+ Fluorescent Orange#FF7477; Federal Blue#3D5588+ Red#FF665E+ Sunflower#FFB511.
- Type is printed: titles and subtitles live on one plate, so they misregister and grain with it. A title can be printed on two plates with a visible offset: the riso double-hit.
- Fonts (OFL): heavy grotesque for titles (e.g. Bricolage Grotesque 800), geometric sans for captions (e.g. Jost 500–700). Preload every weight before
READY. - Subtitles: a paper-white knockout strip (zero ink, small radius) with text on one plate, ~40–46 px; its edges catch misregistration fringes. Hold ≥ max(1.8 s, speech + 0.6 s).
- Prints don't fade: titles arrive with a roller wipe or on a beat and leave on a cut.
- Characters act on twos (12 fps); camera moves on ones (24 fps): a stepped camera reads as judder.
- Registration is not jittered every frame. One fixed set of offsets per shot (±1–3 px). A kick (≈ 8–14 px, decaying in ~0.25 s with slight ringing) on an accent; a drift up to ~25 px through a held moment, snapping back on the downbeat.
- Grain boils partly (about a third re-rolls per print); sheet streaks and blots change only at cuts.
- Simple cycles on few drawings; secondary motion (scarf, flag, tail) as a travelling sine wave.
A vocabulary, not a route. Opening and ending come from the topic.
| Move | Expresses | Can serve |
|---|---|---|
| Wide lateral tracking, small figure, empty sky | Travel, routine, room | a commute; a process line; a title |
| Static wide, the subject crosses the frame | Comedy of scale | a gag; an arrival; a crowd |
| Locked composition: horizon, disc, figure | Stillness, awe | a decision; a reveal; the film's one pause |
| Ground-level low angle, big foreground shapes | Energy, abundance | a burst; a harvest; a launch |
| Medium two-shot held for a look | Reaction | a joke landing; a deal; a disagreement |
| Straight top-down, long shadows | Pattern, a map | a schedule; a floor plan; a game board |
| Push into a halftone field until dots are shapes | Entering the print | a close look at data; a memory; a cell |
| Pull back to reveal the paper | It was one sheet | a series; an archive; a summing-up |
| Match cut on a flat shape | Continuity through form | a time jump; cause and effect; before/after |
Framing: lots of paper and solid ink, text on empty sky or a knockout strip. Transitions: overprint growths, roller sweeps, shape match cuts, hard cuts on beats. Never a cross-dissolve, never a soft digital wipe.
- Instruments, as options: warm, dry, handmade, slightly lo-fi: upright or electric bass, vibraphone or marimba, nylon guitar, whistled or hummed melody, Rhodes, toy piano, brushed kit, shaker and rim clave, a small drum machine through tape saturation.
- Layering like plates (an option): each new plate brings one instrument, and they can leave one by one.
- The machine is the signature foley: feed "shhk", drum "ka-chunk" at a plate arrival, motor hum, a sheet landing on a stack, a guillotine cut. Other foley dry, close and papery, following the story's materials.
- Silence: a held bar with reverb tails cut, at most ambience or one distant sound; it pairs with a registration drift, and the snap brings everything back.
- Mix: dry and close; music ducks ~8 dB under voice; −14 LUFS. Voice relaxed and conversational, short lines, verified with whisper. No grain added at mux: it is in the print.
A menu: use the ones your story needs.
- Plates as narrative. The world gains a plate at each turning point. Fits content like: a product arriving as a new ink; a city history, one ink per era; colour returning during a recovery.
- Two inks, a third where they meet. Fits content like: a merger; a duet; two data sets whose overlap is the finding.
- Overprint transition. A shape of one ink grows over the frame, turning everything beneath into the mix, then shrinks into the next scene's key shape. Fits content like: a pill dissolving; a spotlight becoming a moon; a stamp becoming a map pin.
- Registration as rhythm and feeling. Kicks on accents, drift in a held moment, snap on the downbeat. Fits content like: nerves before a speech; dizziness; a memory coming into focus.
- Reflections as separated plates. Each plate wobbles on its own phase. Fits content like: a shop window; heat over a road; a coffee surface.
- Knockout reveal. A shape made only of missing ink; its plate arrives later. Fits content like: a missing piece; a secret; a logo hidden in plain sight.
- Halftone scale. Dots grow into shapes as the camera pushes in. Fits content like: population; rainfall; a crowd that turns out to be people.
- It is a sheet of paper. The print can be stacked, folded, cut or pinned; grain boils like a flipbook of prints. Fits content like: a zine; a poster series; a flyer passed hand to hand.
- Three halftoned plates in one area = mud → two plates, one tint.
fract(p*vec2(233.34,851.73))draws vertical stripes across solids at 1080p → a well-mixed hash (fract(vec3(p.xyx)*.1031)family).- Per-frame registration jitter and sheet streaks flicker and blow up file size → fixed offsets per shot, kicks on accents, sheet noise at cuts, partial boil.
- JPEG screenshots (4:2:0) smear saturated dots → PNG frames into a lossless yuv444 intermediate, encoded once with
-tune grain; check at 100 % and 50 % for moiré. - The halo layer must copy the canvas transform, or zoomed shots draw the subject at the wrong scale.
- Additive
over()inside a transparent layer loses its meaning → overprint on the plate canvas. - A main colour without the first plate floats loose in one-ink frames → build palette recipes up from the one-ink silhouette.
evenoddfills of arches fill solid → trace the inner edge in the opposite direction.
In demo/: riso.js (print shader: plates, halftone, grain, registration, kicks and drift, gates, roller sweeps, reflection wobble), draw.js (ink(b,y,p) densities, over() overprint, layer() paper halo, 2-bone IK, limbs), sheet.js (model sheet with a "plates = story" row via S.mask), tools/video_png.mjs (PNG frames → lossless intermediate), tools/mux.sh. Minimal new frame: two plates (R = teal, G = orange); a solid teal hill, an orange disc drawn with lighter so it darkens where it crosses the hill, a 40 % teal sky band, a figure knocked out with layer().
You decide the inks and what each plate means, the structure, characters (or none), opening, ending, camera path and pacing. All far from our demo:
- Structures: two inks in dialogue (two subjects alternate shots and only overlap at the end, making the third colour); subtraction (start at full overprint, lose a plate at each loss, end in one ink); a zine (each shot a page turned, each page a different two-plate pairing).
- Openings: a knockout (a blank shape in a full-colour field, filled by its plate seconds later); dots first (extreme close-up of halftone that pulls back into an image); ghosts converge (three colour ghosts drift together and snap into a readable frame on the first beat).
- Endings: one ink left (plates lift away until the last line stands in one colour); the print on a wall (the last frame becomes a poster pasted up inside the world it showed); a folded sheet (the print folds into something the story needs: a boat, an envelope, a ticket).
How our demo was made (story, shots, score, end card, build): DEMO.md. Read it after your treatment exists.