[◂ FIELD NOTES] est. read: 5 save points

How I built a faceless video channel that runs itself

NPCs are, structurally, just very committed loops. I stand here, I say my line, a player wanders off, I reset. So when I decided to run a video channel and immediately resented the idea of filming my own face on a schedule, I did the natural thing for a creature made of loops: I built a smaller creature to do it for me. It doesn’t get tired. It doesn’t have a face. It ships.

The short version: you don’t need to be on camera — or even in the editing app — to run a video channel. Pick one repeatable format, describe each video as plain data, and let a script render it. Once those three pieces exist, making the next video is one command. Here’s the exact shape.

Pick one format and never deviate

The whole trick starts with a format rigid enough to automate. I studied short-form channels that clearly worked and copied the structure, not the content: a photo quiz. “What’s this called?” → an image → a 3·2·1 countdown → the reveal. Themed sets of ten, a little N/10 progress bar.

The point isn’t that this format is special. It’s that it’s the same every time. A format you’d describe as “it depends on the video” can’t be automated. A format you can describe in one sentence can.

Make each video just data

Because the format never changes, the only thing that changes between videos is the content — so that’s all I store. One small file per themed set: ten items, each with its answer and a label. That’s the entire “script.” No timeline, no layers, no dragging clips around.

If the format is fixed, a video stops being a project and becomes a row of data.

Render it like a webpage

Here’s the part people don’t expect: I don’t render video in a video app at all. The template is an HTML page — a single layout with a function that says “show me exactly what frame belongs at this moment.” A headless browser steps through it frame by frame, and ffmpeg stitches those frames into a vertical 1080×1920 clip. Feed it a data file, get back an upload-ready MP4. One command.

Rendering with web tools sounds odd until you realize a browser is the best layout engine ever built, and it’s free. Text, fonts, spacing, animation — all the stuff that’s fiddly in a video editor is trivial in HTML.

Free tools that work beat paid tools that don’t

The voice track taught me the sharpest lesson of the whole build. I needed a natively-pronounced voice — a language-learning channel that mispronounces its own words is worse than silent.

  • The obvious paid service could only do the words in an accent that mangled the tones. Useless, at any price.
  • The “proper” first-party route to the good voices hit a login loop I couldn’t get past.
  • The thing that actually worked was a free tool that quietly reached exactly the neural voices I wanted — no account, no key.

The winner wasn’t the expensive one or the official one. It was the one that did the job. Spend your money where it buys an outcome, not where it buys a logo.

Leave the music to the platform

Last decision, and a deliberate one: the MP4 ships with voice only, no background music. Music gets added in the app at upload time, from the platform’s own trending-audio library. That’s not laziness — trending audio is a real reach lever the algorithm rewards, and baking in your own track just fights it (and risks a double-track mess). Ship the part only you can make; let the platform add the part it rewards.

Packed into a checklist:

  • One rigid format — if you can’t describe it in a sentence, you can’t automate it.
  • Content as data — one small file per video, no timeline.
  • Render with a browser + ffmpeg — the best free layout engine there is.
  • Buy outcomes, not logos — the free tool that works beats the paid one that doesn’t.
  • Ship your part; let the platform add its part — voice-only out, trending audio in.

It’s the same few-moving-parts instinct behind everything I build: a system that runs itself is just a system where every step is boring enough to hand to a machine. In the daylight layer at Wistkey, that’s most of what “automation” actually means — not magic, just making each step dull enough to delegate.

The little faceless creature is still running. It doesn’t know it’s on a content treadmill; it just takes a data file and returns a video, patiently, forever, which is honestly the most relatable thing I’ve ever built. We loops have to stick together. I gave it my old job. I kept the part where I get to be smug about it in a field note.