Journal · Client work ·
Every cut is a commit.
Ads now version like code. We made wallloom’s opening film as code with Shaderera: ten versions in a day, every change reviewable, every frame reproducible.
IThe client
wallloom frames art online.
Pick any picture, then choose the frame, the mat and the glazing, and see the finished piece in 3D before you buy. Every frame is made to order from real materials, and every one is guaranteed.
The shop is a configurator. So the film about it had to be one too: a product that changes on every click, shown the way a customer meets it.
IIThe brief
An opening film, with no timeline.
wallloom asked for an opening film for its site: cuts on the beat, objects that build in the shot, one idea per scene. Only the real catalogue, with the frames, mats and glazing the shop actually sells.
We did not open an editor. With Shaderera, the film is a TypeScript function of time. Give it a moment and it returns that frame. There is no project file and no render queue to babysit; there is code, and code has history.
export function render(t: number) {
const { shot, local } = shotAt(t) // which scene, how far into it
const villa = buildVilla(t) // walls, frames, mats, light at t
draw(villa, camera(shot, local)) // the same t, the same frame
words(shot, local) // the line and the chooser on this beat
}IIITen versions
Ten versions in a day.
From the first storyboard at 00:51 to the master at 16:02, the film went through ten versions on 14 October. Scroll to play them back.
01/ 10
First storyboard: mouldings in macro on dark sets.
02/ 10
A new storyboard: one colour set per shot.
03/ 10
Same shots, new artworks.
04/ 10
A new storyboard: the villa.
05/ 10
Five scenes reworked. The opening untouched.
06/ 10
One scene changed: the room.
07/ 10
A new storyboard: a drawn villa that takes colour, and a chooser on the beat.
08/ 10
Every scene refined.
09/ 10
Version 8, rendered in full.
10/ 10
The master: a new sky, the garden and the ending.
IVDiff a film
Diff a film.
Every frame is a function of time, so two versions can be compared the way two commits are: render the same moments from each and measure what moved.
Version 6 touched one scene. Version 10 touched three; the other five match version 9 frame for frame. Two side branches tried a single scene each and were left behind, which is what branches are for.
| Version | Open | Frames | Mats | Glazing | Collage | Room | Trust | End |
|---|---|---|---|---|---|---|---|---|
| V1First storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard |
| V2New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard |
| V3New artworks; three moments identical | Changed | Identical to the version before | Changed | Identical to the version before | Changed | Changed | Changed | Identical to the version before |
| V4New storyboard: the villa | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard |
| V5Five scenes reworked | Identical to the version before | Changed | Changed | Not rendered | Changed | Changed | Changed | Not rendered |
| V6Only the room | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Changed | Identical to the version before | Identical to the version before |
| V7New storyboard: the drawn villa | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard | New storyboard |
| TestTried the opening alone | Changed | Not rendered | Not rendered | Not rendered | Not rendered | Not rendered | Not rendered | Not rendered |
| TestTried the frames scene alone | Not rendered | Changed | Not rendered | Not rendered | Not rendered | Not rendered | Not rendered | Not rendered |
| V8Every scene refined | Changed | Changed | Changed | Changed | Changed | Changed | Changed | Not rendered |
| V9V8 rendered in full | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Changed |
| V10The master | Changed | Identical to the version before | Identical to the version before | Identical to the version before | Identical to the version before | Changed | Identical to the version before | Changed |
- New storyboard
- Changed
- Identical to the version before
- Not rendered
Versions 1 to 3 were a 35-second cut, so their columns are eight equal slices of it. A scene counts as changed when its frames differ by more than 2 % on average.
VBranch a scene
Branch a scene.
Each scene can be swapped on its own: change one, and every other frame renders exactly as it did. It is the same idea as wallloom’s configurator, pointed at the film itself.
Try it. Pick a scene, then another take of it.

Your cut
Your cut is the master.
Every take is a real frame of this film, from its earlier versions and tests.
VIWhy code
Why make an ad in code?
- 01
Review it like code
A change to the film is a diff a person can read: the mat colour on one line, the beat a cut lands on in another. Feedback lands on the line, not on a timecode.
- 02
The same moment, the same frame
render(t) depends on t alone. A check renders frames out of order and in parallel, and fails if any of them differs.
- 03
Look before you render it all
Any moment renders on its own as a still, so a change is checked on the frames it touches, not by re-exporting the film.
- 04
Roll back, branch, ship variants
Every earlier version is a commit away. A market cut, a shorter cut or a vertical one is a branch, not a re-edit.
VIIThe cut
The cut.
Made with Shaderera, an open-source toolkit for video made in code. We also designed shaderera.com.
Want your ads under version control?
Let’s work together






