opencctv.org

The six cameras at McMurdo, and the 374 sources behind the map

· updated 2026-10-09 · all posts

The Arrival Heights camera sits on the hill above McMurdo Station and looks down the length of it: fuel tanks and a yard of parked vehicles in the foreground, the dormitories and the galley strung along the road, then the sea ice running flat to the horizon. Its feed is a still that replaces itself every thirty seconds. Counted from our own camera table at 01:10 UTC on 2026-10-09, that is the quickest refresh of any camera we carry in Antarctica, tied only with the gravel strip at Union Glacier.

The module that carries that camera knows six cameras and nothing else. Four at McMurdo, one at the South Pole, and Palmer Station on Arthur Harbour, which points out across open water at the brash ice and the blue station buildings on their patch of bare rock. The per-source table had all six of them active at 01:08 UTC on 2026-10-09. That is the whole source, and it is worth having: there are 23 live cameras in Antarctica on the map today.

What a source actually is

A source module is three things. It fetches a list from somewhere public, it turns each entry into a row with an id, a name, a latitude and longitude, a feed URL and a category, and it hands the rows to the ingest. Everything else is detail about how badly the upstream wants to be read.

The shape does not change with size, which is the part that surprises people. Counted from the per-source table at 13:09 UTC on 2026-10-07, windy carries 15,306 live rows out of 18,407 ever seen, state511 13,065 out of 17,508, castlerock 3,066, and usap carries its six. Same contract, same forty-odd lines of mapping, four orders of magnitude apart. Across all of them the map held 141,596 live cameras from 157 countries this afternoon, out of 449 source modules that have ever written a row and 374 that had a live one today; the public summary rounds that to 460+ registered sources.

What varies more than size is the kind of feed at the end. Of those live cameras, 114,626 are a still image you re-fetch, 19,371 are HLS, 5,318 are an iframe we cannot see inside, 1,391 are MJPEG and 890 are MP4 clips, which is the shape TfL's jamcams take. A still image takes one fetch and a hash to verify, and it gives you a frozen moment to look at. The ten second clip is the other way round on both counts, which is why it is the one worth putting on a second monitor.

An afternoon, in the order you try things

The reason a new source can go in between lunch and dinner is that there are only about eight shapes of public camera list, and most agencies use one of them without saying so.

The first guess is the IBI Group 511 platform, because so many US states run it and the map's own icon endpoint is usually open even when the documented API wants a key. Florida's returned 4,962 camera entries in 811 KB this afternoon, no key, no referer check, in under a second. The second guess is the Iteris CDN, a flat GeoJSON file sitting on a hostname made of the state code: South Carolina's says total_streams: 795 at the top of the file and carries an HLS URL for each one. Third is ArcGIS, which is where most DOTs that built something custom ended up anyway.

When none of those works, the site is usually a single page app that answers every URL with the same HTML shell, and the thing to do is read its JavaScript bundle instead of guessing paths. That is how the Castle Rock states turned up: the bundle names a backend host, {state}tg.carsprogram.org, and Minnesota's hands back 1,532 cameras with coordinates, a route id, a human description of where it is, and a list of views per camera. Minnesota, Kansas, Nebraska and Ireland all came in through that one pattern, which is 3,066 live cameras today from an afternoon of reading minified JavaScript.

City systems are their own ladder and often better than the state's. New York City's traffic management centre publishes its whole list as plain JSON with no key at all: 975 cameras on 2026-10-08, 973 of them flagged online, each one carrying the URL of its own image.

Not everything opens. Ontario's 511 answered Invalid Key this afternoon on the endpoint that used to be public, which is the ordinary weather of this work rather than a surprise.

Three rules bought at full price

The traps are not in the fetching. They are in the mapping, and they all look fine on a dashboard.

The first is that an id must keep naming the same physical camera between ingests. Several sources derived it from a position in a list instead, and an upstream reshuffle then re-pointed each of our rows at a different camera while the name and the map pin stayed frozen from the day the row was inserted. Across five sources, 6,527 cameras were serving a live picture under somebody else's name, found and repaired between 2026-08-22 and 2026-08-26; Illinois and Iceland were the worst of it. Every health check passed the whole time, because the feeds were alive. Only the labels were wrong. The guard we wrote out of that now refuses the write when most matched ids have swapped feeds, and it caught Calgary by itself a few days later, 196 of 206 ids pointing at a neighbour, ingest halted before anything was saved.

The second is that a coordinate you did not get from the source is not a coordinate. Hashing an id into a box around a country's centroid puts a camera on the map, which feels better than leaving it off, and then the reverse geocoder attaches a confident city name to the invented position and that city feeds a location page. An unplaced camera is a gap somebody can fill later. A placed one that is wrong is invisible until a reader writes in.

The third is that a source has to be told what it is. A module with no category entry used to inherit traffic, which is right for a DOT and silently wrong for a dog daycare, a coast guard and a French tourism platform, all of which shipped as traffic cameras. Every registered source now needs an explicit entry and a test fails until it has one.

What is next

We are going to publish the per-source table: what each module is, where it reads from, how many cameras it has and when it last ingested. It exists internally and there is no good reason it is not a page, and it would make the 460+ on the about page checkable instead of a claim.

The thing I have not solved is Antarctica, and it is the one I keep coming back to. Five working cameras at two American stations is not nothing, and the other national programmes down there mostly publish a photo gallery rather than a feed with a stable URL. If you know of a station camera anywhere south of 60 that publishes a current frame at an address that does not change, I would like the link.

Corrections to [email protected].