Skip to content

Repository files navigation

Windgram

Windgram publication pipeline and package-rendered reference windgram

npm version CI status Data publisher status MIT licence

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.

The whole path, in one repository

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.

Use the data directly

curl -sS https://data.meteo.azohra.com/hrdps-continental/sites/dundee.json \
  | jq '.hours[] | {validAt} + .derived'

Build with TypeScript

npm install windgram
import { 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.

What the charts teach

Six teaching scenarios rendered by the package, each captioned with the lesson it demonstrates

Committed teaching scenarios, rendered by the same package every consumer installs; the reading guide explains every mark on them.

Published data

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.

Run the Python publishers

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/tests

The 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 a site

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.

Lineage

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.

Licence

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.

About

Open soaring forecast pipeline: per-site windgram profiles from myriad weather models, the contract, derivations, and reference renderer

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages