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.
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.
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.1The public NOAA and ECMWF buckets need no credentials.
Everything is static files on https://dataset.ringsaturn.me/xue/, read
with HTTP Range requests.
-
STAC catalog:
catalog.jsonat 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'sindex.htmllists them. -
Zarr stores: each bundle is
<bundle>.zarr/, a standard Zarr v3 store with CFscale_factor/add_offset/_FillValueandtime/latitude/longitudecoordinates, soxarray.open_zarrreads 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 8601timeor a pinnedrun; OpenAPI at/openapi.json; contract indocs/api.md). The site does not depend on it. -
Decoders:
pip install xuepy(import xue) and thexuecrate (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.
| 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.
/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.
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.
- Specifications:
docs/format.md(container and bundle metadata),docs/zarr-profile.md,docs/stac.md,docs/api.md(data API),docs/encoder.md(native encoder),docs/satellite.md,docs/tc.md,docs/airport.md,docs/sounding.md. - Sources:
docs/sources.md. - Developer documentation:
docs/contribution/(architecture, pipeline, setup, testing, publishing, releasing). - Contributing:
CONTRIBUTING.md.
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 underlicenseandproviders. 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.
This project is built with Claude Code, supported by a Claude Max (20x) subscription provided through Anthropic's Claude for OSS program. Thank you.