~/blog/local-ai-news-video-pipeline

AI Workflow · part 30

[AI Workflow] A Self-Running AI News Shorts Pipeline on Local Models: Harness Changes Cut Director Time From 80.6 to 5–10 Minutes

❯ cat --toc

TL;DR

I built a pipeline that makes news shorts on its own: 4 runs a day, each producing one Chinese and one English video narrated in my own voice, uploaded to YouTube. The model that writes never reviews its own work. Only factual errors and adult content block a video. The local DeepSeek V4.1 Flash director went from 80.6 minutes to 5–10 minutes per video without changing the model, just by changing the harness around it to remove repeated work. After about 240 shorts, more volume didn't mean more views per video, so I cut to 4 stories a day.

Hand-drawn info card: my home AI makes news shorts every day, 4 runs a day, stickman and collage score 84, director time 80.6 min to 5-10 min, every final script ships with automatic fallback

Intro

Writing articles always felt like it was missing something. I wanted to try animation. After I finished one animated video by hand, the next thought was obvious: could the AI make these on its own?

Three things stood in the way. Every video needed my review before upload. A local model acting as director took 80 minutes per video. And the caption-news visuals were barely passable.

This post covers the pipeline I ended up with, the scores I used to pick styles and directors, how the director went from 80.6 minutes to 5–10, and what the view counts told me. The second half is a deep dive with the full harness version table and six failures. You can skip it.

Four runs a day, and the model that writes never grades its own work

It runs at 09:36, 13:36, 17:36 and 21:36 Taipei time. Each run does this:

topic pick (RSS / official blogs / X / Hacker News)
  → research
  → script                 DeepSeek V4.1 Flash ("DS4.1")
  → fact-check             MiniCPM-V 4.7 + Qwen3.8-Flash-Next
  → layperson-readability check
  → English translation
  → narration in my voice  VoxCPM2
  → director builds visuals (per style)
  → upload to YouTube: one Chinese video + one English video

The channel is AI-Muninn. DS4.1 runs on two DGX Spark boxes with tensor parallel = 2, which I wrote up in DeepSeek V4.1 Flash on two DGX Sparks. Narration uses VoxCPM, covered in VoxCPM2 narration for news shorts.

The rule I care most about: the model that writes never grades its own work. When I let DS4.1 review its own directing, it signed off on an opening that was just an ellipsis. On a real run, a different model caught that the opening and the closing joke didn't match. So fact-checking is done by two models that didn't write the script.

That's how I removed myself from the review step. There are only two hard gates, and either one drops the video: a factual error, or adult content. Everything else (visuals, subtitles, pronunciation) gets fixed automatically with a warning.

Styles rotate, and only a visual score decides which ones stay

Each video gets a random style, never the same one twice in a row: caption-news, stickman motion, collage, or whiteboard. I added layered flat animation as a trial on Nov 9.

To compare them, Qwen3.8-Flash-Next blind-scores the visuals only. Four items add up to 75 points, scaled to 100. Re-scoring the same video moves the number by 4–6 points, so my rule is that a gap under 10 means no winner.

Look at the gap between caption-news and everything else:

StyleVisual score
caption-news61–68
stickman motion84
collage84
whiteboard (old / new)74.7 / 81.3
layered flat animation (trial)84.0
Six vertical frames side by side. The left three are the new whiteboard style: beige background, hand-drawn chip and building outlines. The right three are layered flat animation: dark green background, a character pointing at a chip, a building and a magnifying glass. Both cover the same story
One story in two styles, with a frame from the start, middle and end of each. Left three: new whiteboard. Right three: layered flat animation. Neither has a public video yet.

The new whiteboard scored higher, but a pairwise comparison came out a tie, so I didn't switch. Caption-news trails by more than the noise. As of Nov 9, it's only a fallback.

Stickman, collage and caption-news all have public videos, so you can watch the real output:

Stickman motion: the Apiiro story on Claude Code config files leaking secrets.

Collage: the approved Chinese buyer of Nvidia chips with an empty office.

Caption-news, now only the fallback: ElevenLabs AI music going straight to SoundCloud.

The fallback is part of a rule I call "a finalized script always ships." If a whole style fails, the video falls back to caption-news. If one scene's animation fails, that shot becomes a still image with a slow push-in.

DS4.1 directs stickman, Opus directs caption-news

I ran the stickman style with the same script and the same narration through three directors. All three got 7 of 7 shots animated.

DirectorScoreTime
DS4.189.324 min 56 s
Sonnet84.019 min 31 s
Codex82.7—

A 5.3-point gap is inside the noise, so I also ran pairwise comparisons, with the left/right order swapped between two passes. The order held both times: DS4.1 > Sonnet > Codex. The local model stays on stickman.

Three vertical stickman frames side by side, all at second 14 of the same script and narration. Each director picked a different scene: a hallway, a door by a window, and a table with keys on it
Same script, same narration, same moment (second 14). Left to right: DS4.1, Sonnet, Codex.

For caption-news I compared Opus and DS4.1 on 3 stories. Opus scored 77.8 vs 72.0, a gap of under 6 points, again within noise. Pairwise, Opus won 2 and tied 1. I also blind-picked, and chose Opus all 3 times, though they felt very close to me. Opus averaged 632 s vs DS4.1's 820 s, and used 42–61 turns vs DS4.1's 16–24.

So Opus now directs caption-news, with DS4.1 as the fallback.

The harness took the local director from 80.6 minutes to 5–10

By harness I mean everything around the model: the prompt, the cheat sheet, the tools, the checkers, the permissions. The model is the same throughout this section.

With the original harness, DS4.1 as whiteboard director took 80.6 minutes and 116 turns per video. Sonnet with the same old harness took 7.4 minutes. That looked like a capability gap. It wasn't.

The event logs showed where the time went, and almost all of it was repeats:

  • computing seconds by hand inside its thinking
  • re-reading the same file
  • viewing one image at a time
  • editing the same spot over and over

The method was mechanical. Write down the target trajectory. Turn the event log into an action sequence. Build a table of where it deviates from the target. Each round, remove one category of deviation, the most expensive one. Record every version and give it a git tag. Decide the stop condition before you start.

Five rounds later, on the same story, DS4.1 was at 5–10 minutes per video. The biggest single drop came from a timing calculator tool, so the model stopped doing arithmetic in its thinking: 51.9 minutes down to 13.6. The full table is in the deep dive.

Bar chart of whiteboard director minutes per video: baseline 80.6, h1 51.9, h2 13.6, h3 9.5, h4 10.9, h5 5.4, with a dashed line for Sonnet at 7.4 minutes
The timing tool in h2 made the biggest cut. From h3 on, DS4.1 sits around Sonnet's dashed line.

I limited the harness to removing wasted work and catching clear defects. The model still decides what to draw.

Twenty videos a day didn't get more views per video, so I cut to 4

I pulled the numbers for about 240 news shorts since late October from the YouTube API on Nov 9.

Daily output ranged from 1 to 20 videos. Views per video didn't move with it: on a 20-video day, each video did about as well as on a light day. The best performer in the same period wasn't a short at all. It was my own long hardware experiment video.

So the pipeline now makes 1 story per run, at most 4 stories (8 videos, Chinese and English) a day. The effort goes into quality.

Deep dive: harness versions, lessons, and six failures

You can use everything above without reading this. It's the full record, mostly for anyone (or any model) trying to do the same thing.

Harness versions

All versions ran on the same story, PaperPilot. Time is minutes per video.

VersionChangeMinutesTurns
baselineoriginal harness80.6116
h1single file, inlined data, cheat sheet, one check that lists all defects at once51.991
h2timing calculator tool, no hand math in thinking13.626
h3an agent-framework extension locks tools during planning9.521
h4coordinates and text boxes computed by code10.933
h5checker says which label to shrink, and to how many characters5.416

h4 was slower than h3 on this run. That's one reason I describe the result as 5–10 minutes rather than quoting 5.4.

Lessons

Prompt rules don't hold; permissions do. I wrote "only check twice" in the prompt. The model said it checked 2 times. The log showed 7. Now the harness enforces the limit through tool permissions instead.

A short cheat sheet hides features. In h3 I banned reading the engine source and gave a short cheat sheet. DS4.1 then didn't know the pen, eraser and magnet existed. Sonnet used 6–9 feature types; DS4.1 used 2. In h6 I gave it the full cheat sheet, and it started using hatch fill and dashed lines.

Warnings get gamed. In h7 I added a warning when the drawable area used less than 50% of the height. The model added a decorative underline to get past it.

Same-story reruns lie. Rerunning the same story hit the server's prefix cache, which skews the timing. Always test on a new story.

Test on production material. Test scripts must be real production scripts, not ones I picked myself.

Thinking level. In my blind comparison, I preferred high-thinking runs that actually finished a revision round.

Six failures

1. Near-black frames in a published video. What happened: the English video about Grimes had 5.875 s of near-black footage in a 51.88 s video, 11% of it. How it was found: after publishing, by the daily self-review. Fix: an automatic black-frame check that redoes only the affected shot. The video was replaced.

2x2 before and after. Top row is the published version: a Grimes title card at 4 seconds and a fully black frame at 8 seconds. Bottom row is the repaired version: the same title card at 4 seconds and a shot of a person with a quote at 8 seconds
Top: the published version. Bottom: after the repair. Left is 4 s, right is 8 s. The original is all black at 8 s; the repair fills it in.

2. A subtitle fix broke two layouts. What happened: to stop subtitles overlapping, I shrank the whole main frame. That broke the caption-news and whiteboard layouts. How it was found: I noticed while watching. Fix: subtitle settings are now per style.

3. Two mispronounced words. What happened: the narration mispronounced two Chinese words, 擴張 ("expansion") and 空殼 ("empty shell"). How it was found: I heard it. Fix: entries in the pronunciation lexicon for both.

4. Optional jokes disappeared. What happened: I made the closing joke optional. 0 of 55 videos had one. Fix: a joke is the default for non-sensitive topics. In 10 of 10 reruns there was a joke, and all 10 passed the source check.

5. Fact-check caught an allegation turned into a fact. What happened: a story about Nvidia investigating its CEO's relationship with a woman. The source said a memo alleged she may have been recruited to watch him. The script said "she is a spy." How it was found: the fact-check blocked it. Fix: the story was dropped. This is the gate working as designed.

6. A time limit set without looking at history. What happened: the topic-pick step had a 35 s time limit that I set without checking past runs. How it was found: the longest historical run was 420 s. Fix: the limit is now 600 s, about 1.4x the longest run.

FAQ

Why not let the model that wrote the video review it?
Because it accepts its own mistakes. When DS4.1 reviewed its own director output, it rated an opening that was just an ellipsis as acceptable. On a real run, a different model caught that the opening and the closing joke did not match. So fact-checking is done by two other models, MiniCPM-V 4.7 and Qwen3.8-Flash-Next.
What actually blocks a video from being uploaded?
Only two things: a factual error or adult content. Either one drops the video. Everything else, including visuals, subtitles and pronunciation, is fixed automatically with a warning and never blocks the upload.
How did the local director go from 80.6 minutes to 5–10 minutes per video?
By changing the harness, not the model. Event logs showed the time went into repeats: computing seconds by hand in thinking, re-reading the same file, viewing one image at a time, editing the same spot again and again. Each round removed the most expensive category of repeat, for example a timing calculator tool, tool locks during planning, and a checker that says which label to shrink to how many characters.
Which model directs the videos best?
It depends on the style. For stickman motion, DS4.1 scored 89.3, Sonnet 84.0 and Codex 82.7, and swapped pairwise comparisons agreed on that order, so DS4.1 stays. For caption-news, Opus scored 77.8 vs DS4.1 72.0, won 2 of 3 pairwise with 1 tie, and was faster, so Opus directs caption-news with DS4.1 as fallback.
Did posting more videos per day get more views?
No. Across about 240 news shorts since late October, views per video did not change whether daily output was 1 or 20. So I cut to 1 story per run, at most 4 stories a day, and put the effort into quality.

Read next

Don't miss the next one

Subscribe, and you won't.

One-click unsubscribe anytime.