What I automated

The video line

Script in, rendered video out. Voice first, picture second, and a cost gate that stops the run before it spends.

221 commits · first 28 Jul 2026 · last 21 Oct 2026 · 85 days

commits per week, counted from the repository when this page was last built

A terminal on a phone showing the manifest of one video run: seven beats, forty-two seconds, the cost

One explainer video, one lost day

A forty-second explainer for a product page used to cost me a day: write, record, find pictures, cut, re-record because the picture did not fit the voice. And I wanted several per month, in versions, for pages that change.

The idea was a line, not a tool: a script goes in at one end as text, and a rendered file comes out the other, with every step deterministic where it can be and every spend behind a gate.

First commit

e75b57e1 28 Jul 2026

The first commit is a complete prototype without a single API key. Every stage ran against stand-ins so the gates, the timing and the render could be proven before anything cost money. Fifteen commits landed that first day; the line existed by the evening.

It renders, and the linter finds forty-five seconds

e33a09fb 28 Jul 2026

The render engine produced its first real file, and a linter over the script found forty-five seconds per run that were nobody’s decision: pauses that had crept in from formatting. The script format got stricter that same day, with emphasis as its own field instead of stage directions in the text.

A filter that came 3,200 credits too late

c52d220a 28 Jul 2026

Voices were chosen by ear, which is right. But the filter that rejects a bad take before paying for the next one arrived after 3,200 voice credits had gone. The rule that came out of it applies to every generation API in the house: filter before the loop, freeze what was bought, cheapest gate first.

A chart of seven beats: the planned length of each and the measured length of the voice, the voice always shorter
One run, seven beats. The planned length and what the voice actually took. The picture is fitted to the second bar, never the first.

The gates calculate instead of asking the model

ab359203 28 Jul 2026

Is the script too long? Does the budget cover this run? Early on, the model was asked. Now the code counts words, reads the timings and sums the prices. A gate that asks a model for permission is a gate that can be talked into anything.

A gate that approves every case is not one

3f479c1a 29 Jul 2026

The quality gate had passed every production so far. That is not a good sign. Checked against its own history it had never once said no, which means it was decoration. It was rebuilt to fail on a known-bad script first, then allowed back into the line.

A rendered frame from a German product video: a large percentage figure on a dark background
A rendered frame from a run for one of my own products. The video is in German; the line is not. The number counts up to the voice.

The video model tier was a dead switch

fa1fa7f3 4 Sep 2026

A setting chose between two tiers of a video generation model. It was read nowhere. Every run had used the expensive tier regardless of what the setting said. The default is now the lighter tier, and the setting is wired to the call that pays.

A rendered frame: four cards in a row, the last one highlighted
Another frame from the same run. Composed in code, timed to the voice, rendered at thirty frames per second.

The chain drops a video and reports success — still open still open

29ca0a0a 6 Sep 2026

The line renders video. The publishing tool accepts video. Between them, the chain that hands a post over is nailed to image files in five places: given a video it drops the attachment, returns success, and marks the card as sent.

Measured on 6 September: 71 of 71 published posts carried an image and not one video has ever gone out. This one is not fixed. The route through a draft that a person sees before it posts is designed and not built, and this entry says so until it is.

What it does tonight

Seven productions have come off the line. Each one has a manifest next to the master file: beats, voice timings, what was paid, which gates passed. The frames above and the terminal on the front page are read from those manifests, not written by hand.

Runs on its own

  • reading the script, one beat per line
  • voicing every beat and measuring its length
  • composing the picture to the voice, rendering at thirty frames per second
  • the cost gate, the script gate, the quality gate, all in code
  • filing the manifest with prices, timings and versions

Stays with me

  • the script, every word of it
  • the choice of voice, by ear
  • releasing the file anywhere public

The last run cost 0.163 US dollars in voice, nothing in images, nothing in music, taken from its manifest. Runs with generated video cost more, and the prices for that were wrong in two places until the fourth of September.

Where this goes

The output end. A rendered video that no channel receives is a file on a disk. The plan is a video draft in the publishing tool that I approve like any other post, and until that draft exists, every video the line makes is released by hand.