engineering

Crosswire.online

Crosswire.online
platform
Web
languages
English · Spanish · French · German · Portuguese · Italian · Japanese · Korean · Chinese · Arabic · Hindi · Russian · Turkish · Dutch · Polish · Swedish
audience
News readers, expats and travellers, journalists and media researchers, and educators teaching media literacy
status
Live — free, no account, no ads

crosswire.online puts the live front pages of news outlets side by side, so you can see how the same day is being framed in different countries — and across the political spectrum.

The name comes from the journalism practice of cross-referencing narratives across regions. It answers questions like: how is this story leading in Germany versus the UK? What is above the fold in Spain, and is it the same story in France?

How it works

Pick a country — from the picker, or from the interactive 3D globe — and Crosswire renders those outlets’ actual homepages side by side through a server-side proxy. Not scraped headlines: the real front pages, as their readers see them.

Features

  • 907 outlets across 186 countries — the full directory is published as open data under CC BY 4.0
  • Political spectrum presets — curated Left · Center · Right comparisons in 36 countries, with per-outlet leaning labels drawn from AllSides, Ad Fontes and Media Bias/Fact Check, and the sourcing documented publicly
  • Translate in place — any proxied front page can be machine-translated into 16 languages without leaving the comparison
  • Layouts — two, three or four columns, relaxed or compact
  • Favourites — save outlets across countries to browser storage; no account required
  • Outlet profiles — a page per outlet with its leaning, type and description
  • Self-healing previews — a weekly job probes every outlet through the production proxy; ones that can no longer be rendered are automatically skipped and shown as a fallback card with a direct link

Tech stack

  • Next.js 15.5 with the App Router, React 19, TypeScript, Tailwind CSS 4
  • three.js with react-globe.gl for the globe, lazy-loaded as an opt-in browse mode
  • Deployed on Cloudflare Pages. The runtime split is deliberate: the home route and the proxy run at the edge, everything else is statically generated, which keeps the worker inside Cloudflare’s size limit
  • The proxy handles charset detection, bot-wall detection, user-agent escalation and edge caching with a stale-on-error reserve
  • No database and no CMS — the outlet directory is typed data in the repo

I wrote up the engineering problems in Building Crosswire.online.

Built and operated by Nexo Apex SL.

mentions