An open pipeline and renderer for inspectable free-flight windgrams.
A Python publication pipeline, a static JSON contract, and a headless TypeScript toolkit in one repository.
Project site · Documentation · npm package · Research · Feed reference · Site catalogue · Changelog · Contributing
Windgram generates versioned profile documents and supplies the tools to validate and render them. Clubs, pilots, and other downstream publishers decide where, when, and for whom those documents are presented.
Windgram carries a forecast from provider files to an inspectable chart. The layers are independent: use the published profiles without running a builder, bring the typed data into a custom UI, or use the reference renderer end to end.
| Layer | Home | What it provides |
|---|---|---|
| Python publication pipeline | pipeline/ |
Fetches ECCC and NOAA model fields, samples each catalogued launch, derives soaring quantities, and publishes current runs plus history. |
| Static data contract | data.meteo.azohra.com, published from this repo | A discoverable model catalogue, manifests, versioned site profiles, and append-only archives. |
| TypeScript toolkit | toolkit/, published to npm as windgram |
Zod schemas and types, pure derivations, typed findings, transport guards, a serializable scene graph, hit-testing, the reference SVG renderer, and a scene-derived key. |
| Project website | site/ |
Documentation, research, and reproducible teaching figures built with the same npm package available to every consumer. |
The rest of the root serves those layers:
| Path | What it is |
|---|---|
scenarios/ |
Shared synthetic teaching data: recipes and committed profiles generated by the pipeline, consumed by toolkit goldens, site labs, and doc figures. |
assets/ |
Repository-level figures, regenerated from the toolkit renderer and drift-checked in CI. |
scripts/ |
Cross-layer tooling: regenerates committed doc figures, typechecks documentation code fences against the built toolkit, and rebuilds the cross-language parity fixture. |
sites.json |
The authoritative cross-layer launch catalogue every builder publishes from. |
Profiles include surface conditions, winds and temperatures aloft, thermal velocity, boundary-layer top, cloud base, and usable-lift top. models.json declares each model's capabilities and semantics.
curl -sS https://data.meteo.azohra.com/hrdps-continental/sites/dundee.json \
| jq '.hours[] | {validAt} + .derived'npm install windgramimport { parseWindgramProfileJson } from "windgram/contract";
import { buildScene } from "windgram/scene";
import { renderSvg } from "windgram/svg";
const profileUrl =
"https://data.meteo.azohra.com/hrdps-continental/sites/dundee.json";
const response = await fetch(profileUrl);
const profile = parseWindgramProfileJson(await response.text());
if (!profile) throw new Error("profile failed contract validation");
const svg = renderSvg(buildScene(profile, { timeZone: "America/Vancouver" }));The TypeScript documentation covers the contract, transport, derivations, analysis, scene graph, rendering tokens, and ensemble documents.
Committed teaching scenarios, rendered by the same package every consumer installs; the reading guide explains every mark on them.
The pipeline publishes static profiles for a subset of catalogued launches to public object storage behind a CDN, at stable paths:
https://data.meteo.azohra.com/models.json
https://data.meteo.azohra.com/<model>/manifest.json
https://data.meteo.azohra.com/<model>/sites/<slug>.json
models.json is the discovery authority for model
identity, grid, cadence, horizon, kind, capabilities, levels, and lifecycle.
The forecast model feed reference records
provider sources and verification dates.
The profile document, schemas and units, and forecast history references define the published blocks and identity, validation and units, and the append-only monthly archives.
Python 3.12 and uv are required.
uv sync --frozen --project pipeline
uv run --project pipeline windgram build --model hrrr-conus --dry-run
uv run --project pipeline pytest pipeline/testsThe publisher documentation covers external site catalogues, output paths, smoke caps, and full builds. Builders move real provider volume — per-model transports and transfer costs are recorded in the feed reference — and must not run more often than their model publishes.
Add its slug, name, launch coordinates, elevation, and IANA timezone to sites.json. The next successful build publishes it for every model whose domain covers the coordinates.
Windgram descends from canadarasp, which ran this kind of publication for years — the first derivations here were ports of its constants — and follows soaringmeteo in publishing open soaring forecasts. The about page has the fuller account.
ECCC source data is used under the Environment and Climate Change Canada Data Server End-use Licence; derived profiles retain its attribution requirement. NOAA HRRR, GFS, and NAM data are public-domain products distributed through the Open Data Dissemination program. Code is MIT licensed.
Release history lives in the changelog. Cite a released
repository state with CITATION.cff.
Made with <3 by Justin Watts.