Anyone who opened our alert for the magnitude 7.7 earthquake near Ende, in eastern Indonesia, was shown a dark globe with a red dot on central Sumatra — 2,339 km from the earthquake it captioned. On a wire whose whole promise is telling you where something just happened, that dot is the answer to the only question the reader has, and it was wrong on twenty published globes before anything caught it; every automated check on every one of those images passed. Each wrong globe landed on the label point its country carries in a map dataset.
The reason nothing caught it is one line in the renderer: it projects the event's coordinates using those same coordinates as the projection centre, project(lat, lon, lat, lon, R, cx, cy), with the comment "centre by construction". The globe is drawn around the event, so the marker sits in the middle of the disc no matter what went in. The marker cannot be wrong. Hand the renderer a point on another island and you get correct colours, a correct dot, a correct file size, and the wrong continent behind it. The only witness is the coastline.
Checking the coastline instead of the marker
So the gate reads the published image back and asks where it was drawn from. It samples a grid of points inside the disc, classifies each one as land or sea from the pixel colour, then searches for the centre that best explains what it sees. A coarse sweep over the whole globe at 10 degrees, then three refining passes down to 0.125 degrees.
def agreement(samples, lat0, lon0):
hit = 0
for dx, dy, seen_land in samples:
ll = unproject(dx, -dy, lat0, lon0) # image y grows down, the projection's grows up
if ll is None:
continue
if is_land(ll[0], ll[1]) == seen_land:
hit += 1
return hit / len(samples) if samples else 0.0is_land reads a vendored 0.25 degree raster, a 30 KB PNG derived once from public country geometry. Pillow is the only dependency. No network, no geo library, no key.
Two exclusions in the sampler are doing real work. Points past 86% of the radius are dropped, because near the edge of a sphere one pixel spans hundreds of kilometres and a coastline falls on either side of it by luck. Points inside the marker's halo are dropped, because the halo is painted in the same red family as the highlighted country and a pixel under it cannot be classified at all.

FrontWire homepage showing news sources monitored: USGS earthquakes, weather alerts, others — FrontWire aggregates feeds from authoritative sources and publishes them in curated daily briefings.
The agreement score does not tell you it is right
This is the part I would have got wrong if I had trusted the number. The wrong Ende globe scores 98.4% land and sea agreement. It is a beautifully accurate picture of Sumatra. Agreement measures whether the image is a coherent rendering of Earth, and a correctly drawn globe of the wrong place is exactly that. Only the distance between the recovered centre and the coordinates stored beside the image says anything about correctness.
I fetched three currently published globes and ran the gate on them:
| Globe | Stored coordinates | Centre recovered from the pixels | Distance | Agreement |
|---|---|---|---|---|
| Ende, Indonesia (before the fix, 2026-08-15) | -8.3101 / 121.3517 | Indonesia's country label point | 2,339 km | 98.4% |
| 32 km N of Ruteng, Indonesia | -8.3182 / 120.4472 | -7.75 / 119.875 | 89.2 km | 97.9% |
| 75 km ESE of Petropavlovsk-Kamchatsky | 52.9129 / 159.7259 | 53.25 / 159.5 | 40.4 km | 96.1% |
| Hurricane warning, Big Island southeast | 19.2268 / -155.3118 | 19.0 / -156.0 | 76.6 km | 97.6% |
The cap is 100 km. The gap between a correct render and a country-guess render is more than an order of magnitude either side of it, which is why a single flat threshold is enough.
Two rules that keep the gate honest
Bust the cache before you read. Storage serves these with max-age=3600, so for an hour after a repair the plain URL keeps handing back the old bytes. Two globes that had been re-rendered and confirmed uploaded still failed against their pre-fix copies until the check appended a cache buster. A gate reading a cached copy reports a fixed thing as broken, and a freshly broken thing as fine.
An unreadable globe is a failure, not a skip. If the disc cannot be found, or fewer than 120 pixels can be classified, the check fails the run. "I could not tell" is the state every silent wrong-image bug lives in. There is no allowlist and no sampling: every globe row in the window is checked, and the count is printed, so a shrinking denominator cannot pass for a clean run.
This is how we built Front Wire, an automated wire that reads USGS, NWS and SEC EDGAR: https://frontwire.kynth.studio/?utm_source=kynth-devto&utm_medium=social&utm_campaign=kynth
One shipped product, taken apart, once a month. What it does, what it cost to build, what the pipeline behind it looks like, and what the numbers did — read off the repository and the live site, not written from memory. Join the list.
← All writing