Skip to content

Project overview

meteo by Azohra publishes soaring forecasts for a flying community. The forecast engine builds versioned JSON documents for the launches you list, and the TypeScript packages validate those documents and draw the charts. You can run every part on infrastructure you control.

Pick the path that matches what you want to do:

Each package’s section in the sidebar begins with an overview and its install command. The rest of this page shows how the packages fit together.

Responsibility by layer A layer diagram: provider files pass through the decoders and the forecast engine into the versioned JSON documents, which the briefing package reads; weather-station hardware feeds the station package directly; both packages build on core and end at the operator.

LayerWhat it handlesWhat it produces
@azohra/meteo.grib and @azohra/meteo.j2kProvider files: GRIB2 sections, grids, and packing, and the JPEG 2000 images inside ECCC messagesDecoded grids that match ecCodes bit for bit
@azohra/meteo.forecastFetching provider data, sampling each model at each site, and computing values that need raw model inputs or several runsThe values in each published profile
Versioned JSON documentsModel, site, time, semantics, source fields, and derived values in a portable formThe boundary between whoever publishes and whoever reads. Compatibility explains how to read across versions
@azohra/meteo.briefingContract validation, pure derivations from a document, scene construction, hit-testing, and reference SVGAnalysis and chart building blocks
@azohra/meteo.stationReading, deriving, and displaying live station data, with client, server, React, and custom-element bindingsLive station feeds and components
@azohra/meteo.coreUnits, angle and wind-vector math with one sign convention, zod primitives, and the upstream-failure vocabularyShared types and helpers for briefing and station
The operatorChoosing locations, schedule, hosting, retention, presentation, access, verification, and safety languageThe publication their audience sees

The project ships the engine. Each operator runs their own copy of it in a pipeline they control (engine and instance).

The forecast engine computes the stored derivations. These are values a reader can’t recompute from the published profile, such as the boundary-layer top, thermal velocity, cloud base, and usable-lift series. The briefing package computes the pure derivations, which depend only on the published document, and provides the reference renderer. The reader chooses presentation settings: timezone, time windows, palette, overlays, and the sink rate the renderer uses.

usableLiftTopM is the one value on both sides. The calculation lives in the briefing package as a pure function. The engine imports that function and stores its result for a 1.0 m/s sink rate as the published value. A reader who wants another sink rate runs the same code that produced the stored series.

Where each derived value is computed

The forecast engine publishes the stored values. The package derives views and projections from the published document.

The forecast engine derives stored quantities that need provider inputs or cross-run authority. The npm package derives pure functions, typed statements, and a parameterized usable-lift projection from the published document.

Where each derived value is computedThe forecast engine's derivation module derives boundary-layer top, thermal velocity, cloud base, and the default usable-lift top, and writes the published schema-version-2 document once per run. The @azohra/meteo.briefing package reads only that document and provides humidity conversions, lapse and stability, thermal index and shear, day windowing with the timezone as a parameter, typed single-profile analysis, a sink-rate projection from the published inputs, the 1-2-1 smoothing option, and the scene-to-SVG renderer.The forecast engine@azohra/meteo.forecast · derive, buildersStores the derived coreboundaryLayerTopMdry parcel / environment crossingthermalVelocityMps · w*Deardorff scale: heat flux × depthcloudBaseMBolton LCL · saturated-layer floorusableLiftTopMpublished 1.0 m/s sink crossing · cloud capUses provider context beyond the hour blocks:GRIB fields · cross-run history; terrain is echoed in site.schemaVersion: 2The published documentdata/<model>/sites/<slug>.jsonsurfaceSI units · fluxes includedlevelsper level · every hourderivedfour core values · unsmoothedrun · sitereferenceTime · coordinatesThe only interface between the twoThe package@azohra/meteo.briefing/derivePure functions and typed statementshumidity conversionslapse · shear · sink-rate projectionanalyze · cited findings over one profileday windowing · timezone a parametersmooth121 · a renderer optionscene graph → SVG rendererConsumers run it wherever the JSON reaches,with thresholds, tokens, and windows kept downstream.writesper runreadsThe ruleNeeds inputs beyond the published JSON, or cross-run authority → the forecast engine.A pure function of the published document → the package. No quantity lives in both.
Each derived quantity is computed in one place. Either the engine stores it, or the package recomputes it from the published document. usableLiftTopM is the one exception.Units Conceptual ownership map; no numeric scale

The model catalogue declares what each model can publish and what its provider values mean. The model-capabilities guide explains how readers should display those declarations.

The chart at the end of the pipeline is the Meteogram. It lines up surface forcing with the atmosphere above one model grid cell. Reading a Meteogram explains every mark on it. The glossary defines the project’s other terms, and the logbook records how the derivations and visual conventions were worked out. The about page covers where the project came from.