What it is
ATS Aurora Watch is a browser-based, real-time view of the aurora borealis and australis. Every five minutes it pulls the NOAA Space Weather Prediction Center's OVATION model — a one-degree global grid of visible-aurora probabilities covering both hemispheres — and renders it as color-ramped cells over a dark vector basemap, so the auroral ovals appear over both poles within seconds of load. Alongside the map, a live space-weather dashboard tracks the planetary Kp index (with NOAA G-scale storm labels and a three-day sparkline), solar-wind speed, and the interplanetary magnetic field's Bt and Bz components — the physical drivers of the display overhead.
What makes it distinctive is that it treats a fast-cycling scientific model feed as a first-class cartographic layer rather than a static picture. The probability grid is parsed, filtered, and symbolized client-side on every refresh: a deep-green-to-cyan-to-magenta ramp with probability-scaled transparency, an adjustable visibility threshold, and click-to-inspect on any cell. The feed handling is hardened against the real-world drift of NOAA's payload formats, which were verified live during the build and found to differ from their own documentation.
The audience is anyone who plans around the aurora: photographers and aurora chasers deciding whether tonight is worth the drive, science communicators and educators explaining space weather, and operations teams who care about geomagnetic storms. For All Things Spatial, it is also a compact demonstration of the live-feed dashboard pattern the firm sells commercially.
The experience
The app opens as a dark 'mission control' shell with an aurora-green accent (#7cfc98). The map loads on a polar-friendly view with a hemisphere quick-nav — one click swings between the northern and southern auroral ovals. The forecast layer draws immediately: thousands of one-degree cells, greener where a faint display is possible and shifting through cyan toward magenta where the probability is high, with cell transparency scaled to probability so strong signal reads instantly.
A built-in viewing tip sets expectations honestly: the aurora is typically visible to the eye where the probability reads 30 or higher and skies are genuinely dark.
- Threshold slider. A probability threshold (default ≥ 3%) trims the grid to what matters. The percentage label tracks the drag live; the grid itself rebuilds on release, keeping interaction smooth.
- Cell inspection. Clicking any cell raises a tooltip with the exact probability and latitude/longitude.
- Space Weather Now card. A glass-style panel shows Kp severity (quiet / active / storm G1–G5), solar-wind speed, and IMF Bt/Bz — with a southward Bz highlighted in red, since that is the condition that pours energy into the aurora. Observation and forecast timestamps are shown, plus a three-day Kp sparkline drawn on a crisp high-DPI canvas.
- Auto-refresh. The forecast and dashboard refresh every five minutes, with a UTC 'updated' stamp so the currency of the picture is never in doubt.
The data — where it comes from
Everything the app consumes is free, public, and CORS-enabled — there is no licensing cost and no key.
| Source | What it provides | Refresh | Cost | Attribution |
|---|---|---|---|---|
| NOAA SWPC OVATION aurora forecast (ovation_aurora_latest.json) | Global 1° × 1° grid of aurora visibility probabilities (360 × 181 ≈ 65,000 cells), both hemispheres | Model output updates ~every 5 min; app auto-refreshes on the same cycle | Free (public) | Credit NOAA SWPC; OVATION model |
| NOAA SWPC planetary K-index product | Recent Kp values driving the severity readout and 3-day sparkline | Re-fetched on the app's 5-minute cycle | Free (public) | Credit NOAA SWPC |
| NOAA SWPC solar-wind summary products | Solar-wind speed; IMF Bt and Bz (GSM) | Re-fetched on the app's 5-minute cycle | Free (public) | Credit NOAA SWPC |
| Esri dark-gray vector basemap (anonymous) | Dark world basemap under the forecast layer | Vendor-managed | Free (no API key) | Esri attribution renders in-map automatically |
How it was assembled
The application is a fully static single-page app — no backend, no database, no server-side rendering. The stack: TypeScript, ArcGIS Maps SDK for JavaScript 5.0.x, Calcite Design System 5.0.x, and Vite 8.
Module map — the codebase is small and deliberate; each file owns one concern:
Key engineering decisions
- Defensive feed parsing. Live verification on 2026-07-12 showed SWPC payload shapes drifting from their documentation: the K-index endpoint returned an array of objects rather than the documented header-row arrays, and the solar-wind summaries arrived as single-element arrays. The fetch layer parses both variants of each product and tolerates alternate field names (proton_speed/WindSpeed, bt/Bt, bz_gsm/Bz), so a quiet upstream format change does not blank the dashboard.
- Rendering at grid scale. Roughly 80% of the OVATION grid is probability zero and is dropped at parse time; cells above 85° latitude are skipped (Web Mercator blows up there and the oval never reaches them). Fill symbols are bucketed per 2% of probability through a shared cache — one symbol per bucket rather than one per graphic — so the ~12,000 cells at the default threshold render smoothly with a single removeAll + addMany per refresh.
- Interaction cost control. The threshold slider updates its label on every input event but rebuilds the graphics only on commit; rebuilding 12k graphics per drag frame stutters. The Kp sparkline canvas is scaled by devicePixelRatio so bars stay sharp on high-DPI displays.
- SDK 5.x specifics. The 5.x MapView no longer accepts "attribution" in ui.components (attribution renders regardless); the app uses an empty components list plus explicit Zoom and Home widgets.