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.