Weather Intelligence is a browser app with no backend of its own. It reads observations and alerts from Raindrop, gridded data from Cyclone, and account information from CSSL’s auth service. The two data services are independent: they ingest from different sources, store data differently and are deployed separately.
Upstream
ECCC
SWOB observations, CAP alerts and thunderstorm outlooks from MSC Datamart, plus HRDPS, RDPS and radar volumes
NOAA
Aviation Weather Center METARs, plus HRRR, RRFS, NBM, GFS, MRMS, GOES-19 and NEXRAD on AWS
Others
Hydro-Québec, UPEI, HailSTORM, DWD ICON, Nadocast, and NTP and NHP event reports
CSSL services
Raindrop
raindrop.cssl.ca
Stations, observations, alerts and outlooks
Cyclone
cyclone.cssl.ca
Model fields, soundings, radar volumes, satellite and lightning
Auth
auth.cssl.ca
CSSL accounts and the access tokens both APIs accept
Clients
Weather Intelligence
weather.cssl.ca
The web portal
Your application
Anything that calls the public APIs
Raindrop
Raindrop stores point data: station observations, alerts, outlooks and reports. It runs as two processes that share one database. One ingests data; the other serves the REST API.
- Stack: C# on .NET 10 with ASP.NET Core minimal APIs.
- Storage: PostgreSQL with TimescaleDB. Observations go in a hypertable split into daily chunks, and chunks older than a day are compressed.
- Ingest: subscribes to MSC Datamart over AMQP for station reports and alerts as they’re published, and polls other networks on fixed schedules. Readings are converted to standard units and quality-checked before they’re stored.
Cyclone
Cyclone stores gridded data: model output, radar, satellite and lightning. It has three roles that can run together or as separate services:
- Ingest downloads model output and observations as they’re published. For NOAA models it fetches only the fields it needs, using byte-range requests.
- Compute derives fields such as CAPE, storm-relative helicity and composite indices on the GPU, hour by hour as each run arrives.
- Serve is the HTTP API. It reprojects data to Web Mercator tiles on request.
Cyclone keeps every model on its native grid (rotated latitude-longitude, Lambert conformal, polar stereographic or geostationary) as Zarr arrays packed to 16-bit integers, with a SQLite catalog of runs. It’s written in Rust.
Cyclone also processes radar itself. It ingests single-site volumes from ECCC’s radar network and from US NEXRAD sites, then runs quality control, velocity dealiasing and azimuthal shear on them.
Weather Intelligence
Weather Intelligence is a single-page React app built with Vite. MapLibre GL draws the basemap (from Esri), and deck.gl draws the data layers on top. Model fields are fetched as Cyclone data tiles and coloured in the browser, so changing a colour scale doesn’t need new data from the server. A service worker keeps recently used tiles in memory, which makes scrubbing through forecast hours fast.
Accounts
CSSL accounts live at auth.cssl.ca, which issues JWTs signed with ES256. Each token carries the user’s plan (free, pro or commercial) and any organization memberships. Raindrop and Cyclone verify tokens against the auth service’s published keys and make their own access decisions from the plan. See Authentication.