Skip to content

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.

Terminal window
pnpm add @azohra/meteo.briefing

Each 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.

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.

PageCovers
Contract validationAccepting profile, manifest, model, site, and run-index documents at an explicit trust boundary
Load published documentsFetching consistent publications: run-stamp guards, retries, and misses told apart from failures
Pure derivationsQuantities computed from published values, local-day projection, and valid-time alignment
Analyze a profileanalyzeForecast: typed findings over one forecast, with thresholds and evidence attached
Compare model profilescompareForecasts and compareAnalyses: cross-model agreement, spread, and divergence for one site
History and run convergenceThe month-archive reader and compareRuns convergence
PageCovers
Profile documentThe per-site forecast document: blocks, run and site provenance, semantics
Smoke documentThe per-site wildfire-smoke series: fields, units, verified provider facts, and how it joins the profile
Observation documentThe measured GOES-18 series: DSR and AOD, validity rules, product facts
Site context documentMeasured ground truth per site: the elevation pick, terrain, land cover, licences
Model manifestOne model publication’s identity, extent, sites, and build accounting
Model cataloguemodels.json: model discovery and declared capabilities
Ensemble valuesPercentile blocks, contributor counts, censoring, circular wind
History archivesThe append-only monthly gzip archives and their sidecar indexes
Package versioningnpm versions and the finding vocabularies. Document versions are covered in Compatibility
PageCovers
Render a first MeteogramFetch a profile, validate it, and write a chart and its key to SVG
Build a scene graphSerializable geometry and hit-testing from one validated profile
Render SVG and a scene-derived keyDeterministic SVG from a scene, styled through package defaults and tokens
Reading a MeteogramWhat every mark on the chart means, and how to read it
The soundingOne hour as a vertical profile of the flyable band: traces, parcel, wind ladder, with dots at published levels and straight segments between
Compare boardOne local day for every member of a comparison, on one shared clock, with a minimal SVG serializer

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.

PageCovers
Wire an inspectorPointer, keyboard, and pinned selections over the scene’s pure queries
Run an ingestStore 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.