Briefing: the read side
@azohra/meteo.briefing is the TypeScript package for reading the forecasts
the engine publishes. It validates each document,
turns it into typed values and findings, and can
draw it as a chart. It runs in Node, a worker, or a browser; only /history
needs Node.
The package installs on its own and needs Node 22 or later. Browsers and workers need no Node at all.
pnpm add @azohra/meteo.briefingEach capability has its own subpath:
import { parseSiteForecastJson } from "@azohra/meteo.briefing/contract";import { analyzeForecast } from "@azohra/meteo.briefing/analyze";import { buildMeteogramScene, renderMeteogramSvg } from "@azohra/meteo.briefing/meteogram";/history is the one Node-only subpath, because it reads gzip archives with
node:zlib. The documents themselves come from the forecast engine,
@azohra/meteo.forecast.
How the package is organized
Section titled “How the package is organized”The package has two tiers. The data tier validates, derives, analyzes,
compares, loads, and archives. It needs no DOM and returns typed values. The
presentation tier draws three kinds of chart: the
Meteogram (/meteogram), the
single-hour sounding (/sounding), and the
compare board (/compare-board). Each chart
is built in two steps. A validated document becomes a serializable
scene, and the scene becomes deterministic SVG.
If you are new, start with Render a first Meteogram. It uses both tiers in one short script.
The data tier
Section titled “The data tier”| Page | Covers |
|---|---|
| Contract validation | Accepting profile, manifest, model, site, and run-index documents at an explicit trust boundary |
| Load published documents | Fetching consistent publications: run-stamp guards, retries, and misses told apart from failures |
| Pure derivations | Quantities computed from published values, local-day projection, and valid-time alignment |
| Analyze a profile | analyzeForecast: typed findings over one forecast, with thresholds and evidence attached |
| Compare model profiles | compareForecasts and compareAnalyses: cross-model agreement, spread, and divergence for one site |
| History and run convergence | The month-archive reader and compareRuns convergence |
The documents
Section titled “The documents”| Page | Covers |
|---|---|
| Profile document | The per-site forecast document: blocks, run and site provenance, semantics |
| Smoke document | The per-site wildfire-smoke series: fields, units, verified provider facts, and how it joins the profile |
| Observation document | The measured GOES-18 series: DSR and AOD, validity rules, product facts |
| Site context document | Measured ground truth per site: the elevation pick, terrain, land cover, licences |
| Model manifest | One model publication’s identity, extent, sites, and build accounting |
| Model catalogue | models.json: model discovery and declared capabilities |
| Ensemble values | Percentile blocks, contributor counts, censoring, circular wind |
| History archives | The append-only monthly gzip archives and their sidecar indexes |
| Package versioning | npm versions and the finding vocabularies. Document versions are covered in Compatibility |
The presentation tier
Section titled “The presentation tier”| Page | Covers |
|---|---|
| Render a first Meteogram | Fetch a profile, validate it, and write a chart and its key to SVG |
| Build a scene graph | Serializable geometry and hit-testing from one validated profile |
| Render SVG and a scene-derived key | Deterministic SVG from a scene, styled through package defaults and tokens |
| Reading a Meteogram | What every mark on the chart means, and how to read it |
| The sounding | One hour as a vertical profile of the flyable band: traces, parcel, wind ladder, with dots at published levels and straight segments between |
| Compare board | One local day for every member of a comparison, on one shared clock, with a minimal SVG serializer |
Recipes
Section titled “Recipes”The package does not ship stateful pieces like an interactive inspector or a local store. These two pages show how to build them from its pure queries and transports.
| Page | Covers |
|---|---|
| Wire an inspector | Pointer, keyboard, and pinned selections over the scene’s pure queries |
| Run an ingest | Store and serve: poll runs.json, ingest consistent publications, and keep serving through gaps |
JSON Schema for the published documents, with annotated examples, is in
schema/. Every
package that publishes wire documents follows the same
schema-artifact convention.