← All work

Production win

Twelve hours to a channel that runs itself

2 videos/day · 3 platforms · ~8 min per run · 0 manual steps since launch

AI Workflows

System architecture

The pipeline, end to end

Architecture diagram of the AI Shorts Autopilot pipeline: a 06:57 launchd trigger runs a headless Claude Opus runbook that researches, writes, voices via Hume Octave, renders with Remotion, QCs its own frames, and publishes to YouTube, Instagram, and Facebook

One 06:57 trigger. Everything else is the machine.

The bet was simple to state. In one evening, stand up a media brand from nothing (accounts, logo, voice, animation, editorial line) and leave behind a machine that publishes two videos a day on three platforms without me. Not a prototype that needs someone to nurse it through each run, but something that retries, refreshes its own tokens, and holds an editorial line when nobody is watching.

Hours 0 to 2: the spine. While I created the accounts in a browser, a research agent compared six programmatic-video stacks and came back with Remotion, mostly because videos are React components there and headless renders come out the same every time. By midnight the pipeline existed end to end: an episode JSON in, a finished 1080x1920 short out, with a Hume Octave voiceover, whisper.cpp word timestamps, and TikTok-style burned captions.

Hours 2 to 4: the brand. The logo went through roughly ten iterations of a design loop where the model renders a frame, actually looks at it, critiques what it sees, and fixes it. I rejected every blob-shaped brain until an anatomical side profile read correctly: solid left hemisphere, dotted outline completing the right, a neural network living inside. The rejects still sit in the brand kit.

Hours 4 to 6: the operator. The daily engine is not a script. It is a 170-line runbook that a headless Claude Opus session re-reads every morning at 06:57: pick the next curriculum topic, verify the day's biggest AI story across two sources, write both scripts and strip them of AI cadence, choose two different natural voices with acting instructions for tone, render, extract ten frames and inspect them with vision, fix what looks wrong, then publish. The first fully unsupervised run took 8 minutes and both videos were publishable.

Hours 6 to 8: taste, enforced by experiment. I ran the same morning three ways on identical instructions: Sonnet from scratch, Opus editing Sonnet, Opus from scratch. Prose quality tied. Judgment did not: clean Opus caught that Sonnet had attributed a story to an outlet that never ran it, and it declined to burn upcoming curriculum topics early. The model tier was decided by that test, not by vibes. Every taste note from those reviews (captions in the lower third, no announcer voices, no em dashes, ever) became a permanent runbook rule.

Hours 8 to 12: the rails. YouTube's documented forced-private policy for unverified API projects turned out not to trigger; I tested it with a throwaway unlisted upload before trusting it. Instagram's modern API refuses direct byte uploads and demands a public URL, so each video now spends about three minutes as a GitHub release asset before the container is published and the asset is deleted. Facebook granted every permission and then returned an empty page list anyway; the fix is fetching the page token by direct ID. Four landmines in one evening, and each one is now a line in the runbook so the next run does not rediscover it.

The part I would defend in a design review is the runbook-as-product idea. The pipeline code is ordinary. The asset is the accumulated judgment in one prompt file: voice rules, curriculum logic, QC checklists, failure policies (retry once, skip, report, never double-post), and every scar from launch week. Corrections compound. The machine gets more like its editor every day it runs.

The build itself ran on a cost gradient, and so does the machine it left behind. A frontier model sat in the architect seat, but it delegated relentlessly: a Haiku scout swept codebases before decisions, Sonnet subagents did the bulk work (a six-stack video-framework comparison, wiring the QC step, integrating this very page), and Opus took anything that needed judgment. The daily automation inherits the same economics. The expensive model runs for about eight minutes a morning, at the points where a wrong call would end up in a published video, and the cheaper models do the sweeping.

What I would claim is narrow. An agent can hold real production responsibility (research, editorial judgment, rendering, publishing, token refresh) when the system around it supplies bounded permissions, a way to check its own output, and somewhere for human corrections to accumulate.

What I would not claim yet is durability. The whole thing hangs off one launchd timer on one laptop, so a machine that stays asleep is a missed morning. The QC pass looks at frames, which means it catches a broken render and not a boring script. The Instagram path leans on GitHub release assets as a staging CDN, which I took because the API left no other route, not because I wanted a second service in the publish path. And the track record is still only as long as launch week.

The decision

Put an LLM in the operator seat instead of scripting a fixed pipeline. Encode editorial taste in a runbook prompt that the agent re-reads every morning, so every human correction compounds instead of evaporating.

Alternatives considered

  • ·Fixed cron scripts with templated content. Predictable and cheap to run, but nothing in the pipeline notices when a source is wrong or a topic has already been covered.
  • ·A no-code orchestrator like n8n or Zapier. Faster to wire up, but the editorial judgment still has to live somewhere, and a bad morning means reading a canvas instead of a log.
  • ·SaaS video-generation APIs. Least work by far, but the output carries the vendor's template look and the brand stops being mine.

Tech stack

Claude OpusRemotionHume Octave TTSwhisper.cpplaunchdYouTube Data APIInstagram Graph APIFacebook Reels APITypeScriptffmpeg

The challenge

Stand up a real media brand solo in half a day: daily cadence, natural voiceover, real animation, three platforms, and output that never reads as AI slop. Then make it run forever without me.

Architecture approach

  • ·Built the spine as episode JSON to Hume Octave voiceover to whisper.cpp word timestamps to a Remotion burned-caption render, all local and headless.
  • ·Settled the model tier with a controlled three-way test on identical instructions instead of by preference. Sonnet lost on judgment, not on prose.
  • ·Gave the agent a vision pass over ten frames of its own render, with a fix-and-rerender loop bounded at two attempts before it reports instead of retrying.
  • ·Ran three separate publish paths: a YouTube Data API resumable upload, an Instagram Reels container fed by a 3-minute GitHub-release staging URL, and a direct binary upload for Facebook Reels.
  • ·Made the tokens maintain themselves. The YouTube consent screen is published to production, the Instagram 60-day token refreshes on a 25-day cadence, and the Facebook page token is fetched by direct page ID.
  • ·Delegated the build itself by cost: Haiku swept codebases before decisions, Sonnet subagents did bulk research and integration, and the frontier models were kept for judgment calls.

Results

  • 12 hours from empty accounts to autonomous tri-platform publishing
  • First unsupervised run produced two publishable videos in 8 minutes
  • Clean Opus caught a misattributed news source in the model A/B and resequenced the curriculum on its own
  • Four platform landmines found and written into the runbook as permanent rules

What I'd do differently at production scale

  • ·macOS TCC silently blocks launchd jobs from ~/Documents with no error surfaced. The project moved to the home directory with a symlink left behind.
  • ·OAuth apps in Testing status kill refresh tokens every 7 days. Publishing the consent screen to production (unverified) fixes it for single-user apps.
  • ·The Instagram-login API path rejects resumable uploads and demands a public video URL. GitHub release assets, deleted minutes after publish, became the staging CDN.
  • ·Facebook /me/accounts returns an empty list even with every pages permission granted. The page token has to be fetched by direct page ID.

References

AboutEMpathWritingProductionConnect