Every hour, at ten locations across South Africa, a machine asks a modelled estimate what the air looks like and asks a monitor on the ground what it is actually reading. It writes down the difference. This page is that record, unedited, regenerated hourly.
South Africa is barely instrumented. Whole towns have never had an air quality monitor pointed at them, and the coverage is thinnest in the places where exposure is worst.
So ChronosAIR reads two layers. A third-party modelled estimate reaches everywhere, including the towns with no instrument at all. Monitors on the ground reach the few places where something real is measuring. The model gives us coverage. The sensors give us accountability.
The two are kept apart. We do not use the model to adjust a sensor reading, and we do not use a sensor to quietly correct the model. Blending them would produce a number that looks authoritative and that nobody, including us, could ever audit. Instead we publish the distance between them, which is what this page is.
It is not an accuracy score for ChronosAIR. It is not a finished one for the source under test either.
Take every number below as a measure of disagreement, never as a measure of error. We are not claiming accuracy here, in either direction.
There are two reference networks in this comparison, not one. Most readings come from low-cost optical monitors, the class of instrument that counts particles by bouncing laser light off them. The rest come from South African official network stations, which are different instruments, differently sited and differently maintained.
That split matters, and we flag it here rather than bury it: the disagreement runs in opposite directions depending on which network is answering. Some of what looks like the model behaving differently from town to town may be the two networks behaving differently from each other. Untangling that is open work, and until it is done, nothing below should be read as settled.
Optical monitors of this class are typically specified to about ±10 µg/m³ below 100 µg/m³. Read that twice. On a 20 µg/m³ morning the reference is entitled, by its own specification, to be half the reading out in either direction. Any disagreement smaller than that is not a finding. It is the noise floor.
They have a second known weakness. In humid air, water condenses onto particles, the particles scatter more light, and the number climbs while the actual mass of pollution has not. The humidity figure plotted below is also measured inside the sensor housing, which runs warm and therefore reads drier than the air outside it. That makes the humidity plot a weaker adjudicator than it looks.
More instruments, in more places, for longer. AirGradient are sending us additional monitors, and every one of them turns a town we can only model into a town we can also check. Depth is the thing this comparison lacks most: ten locations over one winter is not a national picture, and the hours that matter most are the ones we have fewest of.
One honest limit on that. More monitors of the same class buy coverage, not a second opinion. Identical instruments share identical weaknesses, so two of them agreeing in humid air tells us nothing that one of them had not already told us. What would settle the question is a single reference-grade instrument placed beside one of these for a fortnight. That is a different purchase, and we have not made it yet.
Because the alternative is asking you to trust an air quality number that has never been audited in public, which is the ordinary practice in this field and the reason nobody can tell you how good these estimates are.
The disagreement is large and we would rather you saw it early than found it later. Nothing on this page is shaping a health band today, and nothing will until it has been through a full year of conditions.
Logging and analysis are automated. Correction is not. No correction factor derived from this log reaches a user-facing number without human review, because a system that treats a veld fire as calibration drift will poison months of data in a day.
A residual is the modelled value minus the sensor value. Positive means the model read higher than the sensor. Negative means it read lower.
Band match is the number that matters more than any concentration. The product speaks in health bands, so the question is whether a person would be placed in the right band, not whether a microgram figure is a few units out. A hard miss is a wrong band that was not close to a band edge.
A sign flip at one location is worth more than a run of consistent readings. A systematic instrument bias cannot change sign. If the disagreement points one way in clean air and the other way in dirty air, the cause is in the shape of the estimate itself, not an offset that could be tuned out.
The coverage table underneath is a different measurement. Those are places the product would have to answer for, where each hour we check whether any ground truth exists at all. "Reading" means a station answered with something current. "all_stations_stale" means the stations are there, and not one of them had published anything in the previous six hours.
We reject any reading older than six hours rather than present it as the air you are breathing now. A station that last spoke at breakfast tells you nothing about the afternoon, and the honest answer in that case is that we do not know. The readings we do accept are typically about an hour old.
So stale is not a fault at our end, and it is not missing equipment. It is a monitoring network that exists and is not publishing. At Nieuwoudtville that is roughly three runs in four. At Steelpoort it is close to half. Those counts are the blackout, measured hour by hour, and they are the reason this project exists at all.
Live panel · regenerated hourly by the harness