Architecture

System overview

How Weather Intelligence, Raindrop, Cyclone and CSSL accounts fit together.

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.