swarm
The SWARM ground station's Overview, playing back a recorded run — the instrument itself, not a picture of it.
SWARM is a source-localization research project: a fleet of small LoRa sensor nodes that measure PM2.5, CO₂ and temperature, receivers on USB, and a ground station that keeps the observations, draws the network that carried them, and estimates where a pollution source might be. This page is the station’s front door — the Overview — the same instrument an operator sees, playing back a recorded run over the Monterrey metropolitan area: 110 synthetic nodes in three dense cells and a sparse metro lattice, four simulated gateways, and two assumed sources.
Three questions over one map. Observations — what does each node observe? Numbered pins identify the sensors; the inspector shows readings, units, freshness and position quality. Network — how do readings reach the station? Only links that were actually observed are drawn. Source estimate — where might the source be? The map shades the posterior and names only the marks it draws: a posterior with nothing usable draws nothing, and a collapsed one reads spread below one grid cell with the over-confidence caveat, never as a zero-error result.
What plays here is a recorded synthetic two-source experiment, not a field deployment. The scene assumes two sources — Ternium’s San Nicolás plants (Guerrero and Churubusco) as the dominant one and the Pemex Cadereyta refinery as the secondary — placed at their real positions (Global Energy Monitor) and given synthetic emission strengths. That choice rests on municipal-level inventories (INECC/SEMARNAT attribute most of San Nicolás de los Garza’s PM2.5 to industry and a smaller share of Cadereyta’s to the refinery); it is not a measured attribution to either company, and nothing on this page is a measurement of Monterrey’s air. The sensor frames were generated, then decoded, stored and estimated by the real ground-station pipeline; every value on screen is the station’s own output, packaged with the hashes of the code that produced it and replayed frame by frame. The estimator models one source, so the scene is a known violation of its model: the estimate settles about 2.7 km east of the dominant source and never resolves the second — both true positions are drawn as hollow squares so you can see that. Nothing is recomputed in your browser, and nothing here talks to a server. Localization accuracy and node autonomy are research targets of the project, not results shown here.
On a phone, open it full screen rather than using the frame below.
Select a numbered node on the map or in the roster (grouped by cell: San Nicolás, Cadereyta, Centro, the metro lattice) and the inspector follows it; Replay from start walks the eighteen recorded snapshots at the speed you choose. Node ids above 14 travel on a second frame layout the ground station decodes beside today’s (ADR 0034 in the project); no board transmits it yet. The ES / EN switch in the console header changes the language of the instrument, and the choice is remembered on this site. The map follows your device’s light or dark setting, not this site’s toggle — the Overview is built for a laptop in the field, and there it has no host page to ask.
What you are looking at
The station behind it
The ground station is a Python service with a browser dashboard, built to run on a laptop with no network beyond the receiver on its USB port: the basemap is a bounded PMTiles extract of OpenStreetMap read from a single file (the Monterrey extract stops at zoom 13, so streets are drawn from overzoomed tiles and building footprints are absent), and the map fonts and sprites travel with the build, so the same bundle that runs in the field runs here. The recording was verified against the database it came from before it was packaged — every packaged response equals a re-query of that database — and the fixture names the Git revision and the SHA-256 of the nine source files whose behaviour it depends on.
Map data © OpenStreetMap contributors, under the ODbL; the basemap is built with Protomaps, and the labels are set in Noto Sans. The full third-party notices travel inside the bundle at map-assets/NOTICE.md. The dashboard itself is part of the SWARM project and is MIT-licensed; the project’s code is in a private research repository for now, so what is public is this page, the recording and the instrument that plays it.