The problem
The site is the shop window for this job hunt, and the previous version was actively working against that: a lightly-edited template publishing invented follower counts, another creator’s handle on seven homepage videos, placeholder profile links on the hire page, and a CV button that 404’d. Rebuilding it honestly is the visible half. The interesting half is the worker behind it.
What it does
A Next.js App Router site on Vercel — homepage, a portfolio page combining employment history with the fourteen products, per-product case studies, and contact. Behind it runs a pipeline that scripts, renders and captions short dev videos, deliberately stopping short of publishing anything spoken by a machine.
How it's built
A publish gate enforced by rendering two cuts
The pipeline never ships synthesised speech. It renders two cuts off identical timing — a silent one, and the same visuals with a scratch read so I can hear the intended pacing — so the human step is structural rather than a checkbox someone can skip.
Forced alignment of a freestyle voiceover
When a take was not recorded against the draft, the visuals are re-timed to the delivery instead of stretching the audio. Word-level transcription anchors each scene’s opening words forward through the transcript monotonically with a lookahead, so the cut follows how it was actually said.
Green-screen keying to VP9 alpha, and two lying signals
Headless Chromium’s only natively-composited transparent video format is VP9-in-WebM with an alpha tag, so keying happens node-side rather than per-frame in JS. One encoder flag is load-bearing: without it the encode exits zero, emits no warning, and silently discards the alpha plane — while the obvious probe false-negatives on a correct file. Both the success signal and the failure signal were lying.
Script generation as a forced tool call
The script comes back as tool input rather than JSON in prose, specifically so the API serialises the object. Markdown fences and mis-escaped newlines inside code snippets stop being failure modes, because nothing is hand-serialising JSON any more.
The hard part
Making an unattended render pipeline fail softly. The alpha-channel discovery is the sharpest example — an encode that reports success while dropping the data, and a verification probe that reports failure on correct files — because it means neither signal could be trusted and the only way through was experiment. The site rebuild had its own lesson: nothing fails when a claim is false. No test catches an invented follower count, which is why the rule here is that every number has to be traceable to a source.
Stack
- Next.js
- Tailwind
- Sanity
- Framer Motion
Built, shipped and maintained by me. Try ezeikel.com, or see the rest of the work.