System map · 2026-08-29

Blue Marble News

Government feeds in one end, a finished vertical short out the other. Nineteen Python modules, one database, two paid APIs, and a rule about who is allowed to decide anything.

14 live sources2,271 lines 1 model call for tasterenders on Nami
01 / THE SPINE

Seven stages, three clocks

Nothing here is one script. Each stage runs on its own schedule and fails in its own way, so a break in one never corrupts another.

USGSNOAANASASI-GVP COLLECT hourly · no judgment SCORE thresholds · free BUILD Tue + Sat the only taste call VOICE ElevenLabs v3 RENDER on Nami, 60fps FACT CHECK high finding = fail rewrite, max 2 rounds PUBLISH Ray's click publishing stamps the fence — the next edition opens at that exact second
The fence is the load-bearing idea. An edition opens the instant the last one publishes; every story arriving while it is open belongs to it. It moves only on a successful publish, so a render that dies at 2 AM leaves the edition open with its stories still claimed. The retry finishes it. Nothing is lost and nothing goes out twice.
02 / WHO IS ALLOWED TO DECIDE

Six questions. A model answers one.

QuestionAnswered byWhy not a model
Have we used this story?UNIQUE(source, event_key)the agency already assigned a permanent id
Is it the same story from two agencies?normalised title hash50 collapsed on the first run
Is it breaking?numeric thresholdsa number is auditable; a prompt is not
Land, sea or sky?keyword routing on the subjectthe feed's own label lies — see below
Can we put it on screen?coordinates → satellite, else the articlea lookup, not taste
Which story is best, and how is it written?GPT-4o — the one real callgenuine editorial judgment
Roughly four model calls a week for selection and writing. Everything else is arithmetic, which is cheaper, faster and can be argued with.
03 / THE FUNNEL

195 in, 3 on screen

195collected
57duplicate stories
83unmakeable
3aired

The pillars, before and after the noise rule

Ray killed the routine weather alerts. Dropping those plus the quakes nobody felt did not just clean the pool — it balanced it.

LAND before
1,853
SKY before
173
SEA before
165
LAND after
197
SKY after
173
SEA after
166
Eleven-to-one became almost even thirds. The imbalance was never the world — it was two firehoses.
04 / WHERE PICTURES COME FROM

Three sources, in order

SATELLITE

NASA GIBS

Any coordinate on Earth, one day behind. Today returns an empty frame, so it walks back to T-1 and keeps going until the pixels are real. Rendered at three zooms for wide-to-tight without motion.

ARTICLE

The story's own images

A penguin study and a telescope release have no coordinates, but they ship with pictures — and for the telescope the picture is the story. Scoped to the article body only.

RELATED

Neighbouring stories

Same place, species or mission, pulled from the pool for their imagery. Same-story syndications are excluded by title hash so a segment cannot illustrate itself twice.

The guard that matters. Harvesting whole pages surfaced a White House photograph from NASA's homepage carousel, queued to illustrate the emperor penguin segment. Two defences now: extraction is scoped inside <article>, and any image found on two different pages is banned permanently by content hash.
05 / STANDING DECISIONS

Settled, and why

One voice. Never two.
A two-anchor desk was built and rejected — alternating speakers read as two half-shows spliced together. Variety comes from tags inside one voice. Currently Liam, ElevenLabs v3.
No motion on any still — except space.
The standing guardrail is absolute and carries one carve-out: Ray asking by name, which he did on 2026-08-27 for space imagery only. Earth frames never move. The zoom is 8.5% across a shot, down from a 62% lunge.
Segments are never announced.
No "first up", no pillar names. Three labelled blocks bleed viewers at every boundary. Turns are a dip to black and a named destination.
The fact checker judges facts, not taste.
Asked which story should lead, it answered differently every run. An unreliable signal mixed into a reliable one poisons both. It now checks claims and voice only; an invented fact fails, a wording quibble does not.
Renders never run on this box.
ffmpeg lives on Nami. Cerberus authors, the sibling renders, and only media crosses — never code.
06 / WHAT IT COSTS TO RUN

Per episode

~1,500ElevenLabs credits

1 credit per character, measured. Free tier is 10,000/month — about 6 episodes.

4model calls

Pick, write, fact-check, revise. Pennies.

$0imagery

All US government public domain. Credited on screen regardless.

Three videos a week at three minutes needs about 27,900 credits a month against the $6 tier's 30,000. It fits, with roughly one retry spare. The free tier does not.
07 / WHERE IT STANDS

Working, and not

Working end to end

Hourly collection · dedupe by key and by story · subject routing · whole-earth imagery · the edition fence · ranked candidates with runners-up kept · scripting · adversarial fact check · revise loop · ElevenLabs voice with inline tags · 60fps render on Nami · destination cards · Iris registered as a Head with her own memory

Still wrong

The voice lurches — a tag every 7.7 words is a seizure, not a performance · stability pinned at 0.0, the most volatile setting · transition cards hold black up to 5.7s · no music · the volcano has only three frames · no review surface for approving or swapping a pick · no GitHub repo pair, so all of this lives only on this box

The next fix is the voice, and it is my error. I told the writer to place tags mid-line because that is what ElevenLabs can do and OpenAI cannot. It obeyed — two tags per twelve-word line, fifteen lines running. One tag every three or four lines, stability off the floor, and the punctuation carries the rest.