Skip to content
ringsaturnPublic

About

Live weather models, radar and satellite, played back in the browser: GFS, ECMWF, AIFS, HRRR, MRMS, Himawari, GOES and more, served as static Zarr from a CDN with no API server.

Topics

Resources

Contributing

Stars

14 stars

Watchers

1 watching

Forks

Latest commit

 

History

690 Commits

Folders and files

雪 / Xue

test docs

Xue (雪, pronounced /ɕɥɛ/, roughly "shweh"), Chinese for snow.

Live weather models, radar and satellite, played back in the browser: https://xue.ringsaturn.me

  • Forecasts from GFS, ECMWF IFS and AIFS, HRRR and CFSv2: temperature, precipitation, wind particles, isobars, upper-air charts, clear-air turbulence; skew-T soundings and point meteograms anywhere.
  • Observations: MRMS, NEXRAD, JMA and CMA radar; Himawari, GOES and Meteosat imagery with dust products; METAR, soundings, typhoon tracks.
  • A globe with terrain, 3D radar volumes, and replays of past events (showcase).

The title in the top-left corner switches between sources.

There is no server behind it. Every run is a set of per-variable Zarr v3 stores laid out for playback (quantized single-byte planes, small spatial tiles × six consecutive steps per chunk, one shard per variable; docs/zarr-profile.md) with a STAC catalog, published as static files on a CDN. The page reads them with HTTP Range requests: a Rust WebAssembly worker decodes chunks on demand, and a WebGL2 layer projects and colours them on the GPU. The same stores open in Python with xarray or the xuepy wheel. Code is MIT or Apache-2.0. The earlier single-file container, .xue (docs/format.md), is no longer published and every decoder still reads it.

Sources

Source Grid · cadence Newest run (UTC)
NOAA GFS (gfs) 0.25° global · hourly to F120, 3-hourly to F240 the newest gfs run
GFS surface flux (sflux) ~13 km Gaussian global · as GFS the newest sflux run
ECMWF IFS open data (ecmwf) 0.25° global · 3-hourly to F144, 6-hourly to F240 the newest ecmwf run
ECMWF AIFS Single (aifs) 0.25° global · 6-hourly to F360 the newest aifs run
ECMWF IFS HRES via Open-Meteo (ifshres) 0.1° global · hourly to F090, then 3- and 6-hourly to F360; 00Z/12Z the newest ifshres run
NOAA HRRR (hrrr) 0.03° contiguous US · hourly to F18, hourly cycles the newest hrrr run
Recast WOOF-WRF (woof) 0.005° (500 m) nest over Mount Fuji · hourly from F1 showcase cases only, no live run
NOAA GEFS-Aerosols (gefsaero) 0.25° global · 3-hourly to F120 the newest gefsaero run
NCEP CFSv2 (cfs) T126 Gaussian / 1° global · 6-hourly F6–F6552 (39 weeks); 00Z/12Z the newest cfs run
NOAA MRMS radar (mrms) 0.02° contiguous US · 2 min, rolling 4 h the newest mrms run
JMA precipitation nowcast (jma) 0.005° Japan · 5 min, rolling 3 h the newest jma run
CMA radar mosaic (cma) 0.0439° China · 6 min, rolling 3 h the newest cma run
Himawari-9 (himawari) 0.04° disk at 140.7°E · 10 min, rolling 6 h the newest himawari run
Himawari-9 over Japan (himawarijp) 0.01° Japan box, 24–46°N 122–148°E · 10 min, rolling 3 h the newest himawarijp run
GOES-19 East (goeseast) 0.04° disk at 75.2°W · 10 min, rolling 6 h the newest goeseast run
GOES-18 West (goeswest) 0.04° disk at 137°W · 10 min, rolling 6 h the newest goeswest run
Meteosat-12 (meteosat) 0.04° disk at 0° · hourly, rolling 24 h the newest meteosat run
NOAA SWPC aurora (aurora) 1° global · 5 min, rolling 12 h the newest aurora run

The last column reads the source's live pointer: a forecast's cycle, or the hour a rolling window starts at. Variables, grids and caveats per source are in docs/sources.md. ?model=geo is a mosaic of the geostationary imagers, a view rather than a dataset.

Quick start

Requirements: Python ≥ 3.14 with uv, Node.js ≥ 22, a Rust toolchain with wasm-pack, and GDAL ≥ 3.8 with the GRIB driver. Some sources need more (eccodes, om2nc, ffmpeg, credentials); see docs/contribution/setup.md.

uv sync                   # creates .venv with NumPy and the xuepy wheel
make check                # verifies tool versions
make mvp                  # builds the latest GFS run and the frontend
make mvp MODEL=ecmwf      # or another forecast: aifs, ifshres, sflux, hrrr, gefsaero, cfs
make serve                # serves the result on 127.0.0.1

The public NOAA and ECMWF buckets need no credentials.

Using the data

Everything is static files on https://dataset.ringsaturn.me/xue/, read with HTTP Range requests.

  • STAC catalog: catalog.json at the data root, one Collection per source with a stable live Item, an Item per run, and the showcase cases (docs/stac.md). The root's index.html lists them.

  • Zarr stores: each bundle is <bundle>.zarr/, a standard Zarr v3 store with CF scale_factor / add_offset / _FillValue and time / latitude / longitude coordinates, so xarray.open_zarr reads physical values (docs/zarr-profile.md).

    import pystac, xarray as xr
    run = next(pystac.Catalog.from_file("https://dataset.ringsaturn.me/xue/catalog.json").get_child("gfs").get_items())
    ds = xr.open_zarr(run.assets["tmp2m"].get_absolute_href())
  • Data API (experimental: no compatibility, reliability or freshness guarantee): a read-only JSON API at https://xue-api.ringsaturn.me (/v1/catalog, /v1/sources/{source}, /v1/point?source=&lat=&lon=&variables= with an optional ISO 8601 time or a pinned run; OpenAPI at /openapi.json; contract in docs/api.md). The site does not depend on it.

  • Decoders: pip install xuepy (import xue) and the xue crate (API docs) read both containers.

  • Point products: tropical cyclone tracks (docs/tc.md), airport METAR / TAF (docs/airport.md) and radiosonde soundings (docs/sounding.md), each a pointer, an index and one file per issue.

URL state

Parameter Values
model a source id from the table (aliases such as ifs, hres, radar, goes-east), or geo
type the field: tmp2m, prate, wind10m, solar, radar, hgt500, tmp850 / t850, rh700, qflux850 / vapor850, … (each isobaric field names its own level)
lines a pressure surface drawn as contours over the field (pressure, hgt500)
case a showcase case id; pins its dataset and run
res half (alias low): smallest reduced tier; full (alias high): full resolution
particles off hides the wind particles (also remembered per browser)
stations snd, apt, snd,apt or off: sounding and airport marks
tc, tcagency, tcmodel, tcmembers a tropical cyclone (<id> or off) and which tracks to draw
backend xue reads the .xue container where a run still ships one
use_h264 true opts into the WebCodecs H.264 companions
lang, theme one of eleven locales; light or dark

Values are case-insensitive and unrecognized ones fall back to defaults. The camera is in the fragment, #map=<zoom>/<lat>/<lon>; a link without one opens on the dataset's region. Clicking the map pins a point: the field's value, a meteogram from the same run, a skew-T from a radiosonde within 150 km and the METARs and TAF of an airport within 40 km.

Comparing models at a point

/compare.html?lat=<deg>&lon=<deg> lays every live forecast model at one point on one clock: a block per model, a row per field (?fields=tmp2m,prate,wind10m), five days hourly or fifteen days three-hourly (?span=360), with the nearest airport's METARs above. Each value is the model's nearest grid cell, never interpolated. The viewer's point probe links here.

Historical showcase

Cases are past weather events cropped to their region and hours, listed at /showcase.html and played at /?case=<id>. A case is a checked-in JSON file under showcase/cases/, built with make showcase CASE=<id> and published permanently. See showcase/README.md.

Documentation

Data and Licensing

Three things are licensed separately.

  • Code is dual-licensed under MIT and Apache-2.0 (LICENSE-MIT / LICENSE-APACHE); use either at your option.
  • Specifications, the documents under docs/ (the container, the Zarr profile, the STAC catalog, the point products, the data API), are licensed under CC BY 4.0, as the Zarr specifications are. Implement them in anything; credit "the Xue specification (github.com/ringsaturn/xue)".
  • Published data on https://dataset.ringsaturn.me/xue/ (the stores, the catalog, pointers, indexes and point products) is derived from the sources below and keeps each source's terms, which every STAC Collection names under license and providers. Xue's own contribution to those objects (the layout, the quantization, the catalog) is licensed under CC BY 4.0: credit the source as it asks and add "via Xue (xue.ringsaturn.me)", for example Contains modified ECMWF open data (CC BY 4.0), via Xue.

The sources. Weather data comes from NOAA GFS, NOAA GEFS (the GEFS-Aerosols member) and NCEP CFSv2 (all three works of the United States government and so in the public domain; NOAA requests attribution and does not endorse this use) and ECMWF open data, the IFS and the AIFS (CC BY 4.0, © European Centre for Medium-Range Weather Forecasts; this project distributes converted derivatives: "Contains modified ECMWF open data"). The IFS HRES surface fields (ifshres) are ECMWF's ~9 km operational forecast as Open-Meteo forwards it under CC BY 4.0: "Adapted from ECMWF IFS by ECMWF, licensed under CC BY 4.0", via Open-Meteo. Neither ECMWF nor Open-Meteo endorses this use.

The other sources:

  • HRRR, MRMS, GOES-East / GOES-West imagery and the SWPC OVATION aurora model are NOAA products, works of the United States government in the public domain; NOAA requests attribution and does not endorse this use.
  • JMA precipitation nowcast: Source: Japan Meteorological Agency website (出典:気象庁ホームページ), regridded and reclassified by jma-radar.
  • CMA radar mosaic: a product of the China Meteorological Administration (中国气象局国家气象中心, www.nmc.cn).
  • Himawari-9 imagery is the Japan Meteorological Agency's, distributed by NOAA; reprojected here, no endorsement implied by either agency.
  • Meteosat: Contains modified EUMETSAT Meteosat data 2026 (the year of distribution is stamped wherever the attribution is shown). Only the hourly Level 1 cycle, released by EUMETSAT under CC BY 4.0, is published; no endorsement implied.
  • Radiosonde soundings are WMO core data under the WMO Unified Data Policy — free and unrestricted, attribution of the original source requested. The originating national meteorological and hydrological services are the source of every ascent; the WMO WIS2 Global Cache is the distribution.
  • Airport METARs and TAFs come from the NOAA Aviation Weather Center's cache files (public domain).

The basemap is Protomaps-hosted vector tiles, © OpenStreetMap contributors.

Acknowledgments

This project is built with Claude Code, supported by a Claude Max (20x) subscription provided through Anthropic's Claude for OSS program. Thank you.

About

Live weather models, radar and satellite, played back in the browser: GFS, ECMWF, AIFS, HRRR, MRMS, Himawari, GOES and more, served as static Zarr from a CDN with no API server.

Topics

Resources

Contributing

Stars

14 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages