Morning Lens — how ~30 countries’ morning radio news frame the same day
Strategy & Knowledge • Independent product

Live: lenses.bastian-brand.com
What it is
Every morning, the 06:00 news bulletins from ~30 national radio broadcasters are recorded, transcribed each in its own language, and read side by side — so you can see, story by story, how each country frames the same news day differently. The outlets are grouped by geopolitical bloc (G7 · BRICS · the rest of the G20 · other key states — including adversary voices like Iran, North Korea, Taiwan and Al Jazeera), and the edition is on the table by 06:30. Every outlet’s ownership is shown plainly (public-service, state, private); the tool discloses who’s behind each voice but imposes no credibility ranking — the reader draws their own conclusion. The page has two halves: the stories that several countries cover — contrasted, with what each foregrounds, omits and how it frames it, quoted in the original language — and each broadcaster’s own agenda: the news only it ran that day, each with a short factual summary. Framing is always shown as framing, never as neutral fact. It isn’t another summarizer — it’s a media-literacy tool, closer to Ground News than to a news feed.
How I built it
National streams are captured live each morning by a self-hosted recording service (FastAPI + ffmpeg), then run through a multilingual speech-to-text pipeline — self-hosted whisperx (large-v3) on a GPU, with an OpenAI fallback. The analytical core is a single structured LLM pass that does three things at once: cluster the stories that appear across sources, contrast each source’s framing with grounded original-language evidence, and extract every broadcaster’s own-agenda stories with a factual summary of each. The public page is generated statically every morning by a cron job — no live backend, no hosted audio, only transformative analysis and short quotes by design — and served behind Caddy. Rights-safe was a hard constraint from the start, not an afterthought.
Highlights
- Cross-perspective, not summary: the difference in framing is the product
- Genuinely multilingual: a dozen-plus languages (incl. Korean, Persian, Hebrew, Arabic, Turkish, Russian, Chinese, Hindi) transcribed and reasoned across in one pass
- Even-handed by design: each outlet’s ownership disclosed (public / state / private), no side taken
- Self-hosted STT + LLM synthesis + static daily generation — cheap and robust
Stack
Python · FastAPI · ffmpeg · whisperx (GPU speech-to-text) · OpenRouter (LLM synthesis) · Caddy · systemd cron