ORPHEUS
A code-rendered reel of Bulgarian history in which every picture morphs into the next
- Role
- Solo, directing agents
- Status
- Shipped
- Source
- Private repository
- Stack
- Remotion 4ReactTypeScriptPythonuharfbuzzfontToolsffmpegBlender

In numbers
139.7s
runtime, no voice-over
78
shots, defined in whole bars on the score's downbeats
77/ 77
shot starts land within one frame of their downbeat
20
cuts in v2, against 91 in the reference and 309 in v1
3.53
mean frame difference, against the reference's 4.14
The problem
A viral code-rendered reel about Western civilisation, called Prometheus, set the bar. I wanted one for Bulgaria, from the Varna gold (c. 4500 BC) to the Rhodope song on the Voyager Golden Record, with an original score and no voice-over, in English and Bulgarian. The first frames looked vibe coded. v1 fixed the look and lost the viewer: it cut 309 times and shook the camera, about three times the reference's motion. My verdict was too much movement and too hard to follow, with a request for something that morphs and reads as illustration.
The approach
v2 does not cut: each picture transforms into the next, and the words stand still while they are read. The workspace rules forbid paid services and generative AI models, so each frame comes from code and from sourced fonts and images, with a licence row per third-party file and a source per on-screen claim (453 lines in research/facts.md). Music is the master clock: 78 shots are defined in whole bars and placed on the score's downbeats. The look is woodcut and shevitsa embroidery printed in two plates, black and a misregistered red, on rag paper, with negative linocut for night scenes.

How it works
Key forms
Each picture has a key form: its outline as 144 strokes of 16 points, taken from the picture itself (cut silhouettes, coastlines, letter outlines, engraved line fields). A transition starts on a downbeat and lasts 12 to 34 frames. The outgoing picture is gouged away along parallel lines, its key form sews itself on as a running stitch and flies to the next picture's form, and the incoming picture prints out from its outline along a carve map.
Type that stays readable
Headlines are drawn from font outlines (HarfBuzz shaping, fontTools outlines). Words hold still while read, and whole recurring words glide to their new place: 681 becomes SINCE 681. Letters change shape only where the story is about letters: Glagolitic becomes Cyrillic, and the Б, Г and А of АБВГД glide into БЪЛГАРИЯ. At each frame the screen shows a readable word or none.
Two gates on every render
verify_render.py cross-correlates the audio against the locked score (offset 0 frames) and requires a visible change onset within one frame of each of the 77 shot starts. flashcheck.py applies the WCAG 2.2 SC 2.3.1 general and red flash thresholds frame by frame. The render script exits 1 if either fails, and the share encode is gated again. Remotion's AAC priming offset is avoided by rendering the picture muted and muxing the score with ffmpeg.
Measured against the reference
One ffmpeg script measures every cut: scene score above 0.2 on 160 by 90 frames, plus mean frame difference. The reference reel scores 91 cuts and 4.14, v1 scored 309 and 12.73, v2 scores 20 and 3.53. v2's 20 'cuts' are changes of paper and the busiest title cards; no shot cuts to another.

What I chose, and what lost
Chose
Morph between pictures along key forms and carve maps
Over
v1's cuts, whips, strobes, camera shake and line boil
About three times the reference's motion, and hard to follow.
Chose
Headlines drawn from font outlines, with only whole recurring words gliding
Over
Letters melting into other letters, and words scattering into flying outlines
The mid-state was unreadable, which the first contact sheets showed.
Chose
Carve maps as static PNGs, thresholded by an SVG filter behind a CSS mask
Over
Masking through SVG foreignObject, and CSS masks whose URL changes per frame
This Chromium did not apply the first; the second dropped frames in v1.
Chose
No sound-effects layer in v2
Over
v1's print-shop sound effects
They were timed to v1's cuts, and v2 has none to time them to.
Outcome
The English 2D master passes both gates: 77 of 77 shot starts within one frame, audio offset 0.0 frames, worst flash rate 3 per second. The Bulgarian 2D master is rendered, and its gate row in the README is still a placeholder. The 3D variants of v2 are not rendered. A full-resolution render takes about 11 minutes and a share encode 3. The choir samples are licensed CC Sampling Plus, which rules out advertising use, so the reel cannot become an ad without replacing them.
What comes next
Gate the Bulgarian master, render the two 3D variants from the Blender plates, and replace the choir before any commercial reuse.
Gallery
A frame from the film: the oldest gold treasure.
A frame from the film: the Golden Record.
A frame from the film: Rila Monastery.
The closing mirror of the title card.
A frame from the film: horsemen charging.
Three looks tried; the woodcut was chosen and the other two were dropped.
The woodcut look, chosen for the whole film.
Shapes gouge away and redraw as red running stitches between pictures.
Sixteen seconds from the film, rendered from code.
Tried and dropped.
Tried and dropped.
Each tile carries its frame number.