Browser-based weather visualization rendering ECMWF forecast data.
Live Demo: zero.hypatia.earth Mirror: hypatia-earth.github.io/zero
Zero backend. Zero servers. Zero cost.
Zero visualizes professional weather hazards for climate adaptation:
- Wet-bulb temperature - actual heat survivability limits in humid conditions (planned)
- Wind - animated flow lines showing speed and direction
- Pressure - isobar contours revealing storm systems
- Precipitation - rain, snow, freezing rain with wind-advected particle animation
Runs entirely in your browser. No backend, no login, no tracking.
As climate extremes become more frequent, understanding forecast hazards becomes survival literacy. Zero makes professional ECMWF IFS data accessible without commercial infrastructure - forkable, self-hostable, resilient.
This is architectural independence: the tool works offline once loaded, can be hosted by communities, and doesn't depend on commercial service viability.
- Adaptive parallel downloads - queue probes for the optimal number of concurrent network fetches, finding the sweet spot between bandwidth saturation and connection overhead. Perf panel
pool X/Yshows live slow-task count. Min/Max download options configurable - Faster initial load - bootstrap now fetches priority timesteps in parallel (up to Min Downloads, default 4) instead of sequentially; in-flight fetches properly abort when you scrub time mid-load
- Precipitation param migration - replaced
precipitation_type(WMO codes) withsnowfall_water_equivalentfor rain/snow discrimination. Snow fraction derived from snowfall/precipitation ratio with threshold selection (no shape blending)
- Cloud layer - data-driven cloud visualization using ECMWF cloud cover with sun-edge shading, Perlin noise texture, wind-driven drift, and limb darkening
- Hybrid param bindings - main surface pass now uses both storage buffers and textures for weather params, solving Chrome's 8-storage-buffer limit. Added texture infrastructure for niche layers (sea ice, ocean temp, wet bulb stubs)
- renderScale-independent sizing - graticule lines, text labels, rain particles, and capture crop all stay consistent across 1x/2x/4x render scales via
globeRadiusPxuniform and CSS-pixel-based metrics - Canvas alphaMode: opaque - skip compositor alpha blending for slight GPU perf gain
- City label colors - 4 color presets (white/black/dark red/gold)
- Graticule text - constant screen size at any zoom level
- Cities layer - MSDF text labels for cities >100K population on the globe, with LOD tiers, collision avoidance, and altitude-adaptive indicators
- WESL migration - replaced custom shader concatenation with WESL, a pioneer language extending WGSL with a proper module system. Includes wgsl-edit for custom weather layers with syntax checking and highlighting
- Event archives - replay historical weather events offline via
?event=URL parameter. Vite plugin simulates S3 bucket responses for local archives. Discovery, gap-fill, and backward-sum fallback chains work with archived data - Precipitation crossfade - smooth interpolation of precipitation type between timesteps
- Palette fix - temp-hypatia palette corrected: 10°C bands, 0°C at cyan/green border
- Discovery fix - use reference_time from latest.json instead of current date, enabling correct navigation in archived events
- Vite plugins extracted - cache headers, geonames proxy, om-archive, serve-public-modules moved to vite-plugins/
- MP4 capture - export weather animations as MP4 video with configurable bitrate, in addition to existing GIF export
- Keyframe editor - animated capture mode with draggable timeline keyframes and text-based Flight Plan editor for precise camera path control
- GIF capture - record animated GIFs of the globe with configurable FPS, duration, palette modes (fast/precise/grayscale), and native DPR support. GPU readback pipeline ensures frame-accurate capture across browsers. Two-phase UI shows capture and processing progress inside the capture rect
- Precipitation layer - rain, snow, freezing rain, sleet and ice pellets with advection-based interpolation: GFS wind fields drive ECMWF precipitation displacement for smooth temporal animation between hourly timesteps
- Multi-model fusion - introduced NCEP GFS 0.25° as second data source alongside ECMWF IFS, enabling cross-model rendering at the shader level
- Storage buffer packing - t0/t1 timestep data packed into single combined buffers per parameter, working within Chrome's 10 storage buffer limit
- Aurora render engine - declarative layers with runtime shader composition
- Custom layers - user-defined layers with additional ECMWF parameters: clouds, precipitation
- Unified palette system - shared palette texture with JSON configuration
- Render downscale - option to improve mobile performance
- E2E test suite - 44 Playwright tests covering all active layers (earth, sun, grid, temp, wind, pressure). Screenshot tests with 0% tolerance for visual regression, pixel tests for color accuracy.
- Worker-based renderer - GPU operations moved to dedicated Web Worker via OffscreenCanvas. Eliminates main thread blocking during data loading, improving touch responsiveness on older mobile devices.
Weather data provided by ECMWF (European Centre for Medium-Range Weather Forecasts) via the ECMWF Open Data initiative.
Data accessed through Open-Meteo's S3 mirror, hosted on AWS Open Data.
ECMWF data is made available under Creative Commons Attribution 4.0 International (CC BY 4.0). Zero is an independent project not affiliated with or endorsed by ECMWF.
- Chrome/Edge 113+ (recommended)
- Safari 18+
- Firefox (WebGPU behind flag, experimental)
WebGPU support required. Mobile browsers work but performance varies.
Built through human/AI collaboration:
- Vision & architecture: first prototype in 2017, tech was not ready
- Implementation: 2025, ~20,000 lines of TypeScript/WGSL entirely written by Claude Code
This is an experiment: can domain experts build production software by collaborating with AI? Zero answers that question.
# Clone and run
git clone https://github.com/hypatia-earth/zero.git
cd zero
npm install
npm run dev
# E2E tests (requires dev server running)
npm run test:e2e # Run all 44 tests
npm run test:e2e:headed # Visible browser
npm run test:e2e:ui # Playwright UI with time-travel debugging- ECMWF - IFS forecast data via Open Data initiative
- Open-Meteo - S3 data mirror
- AWI/PANGAEA - RTopo-2 basemap topography
- Cameron Beccario - earth.nullschool.net pioneered browser atmospheric visualization
- AWS Open Data - hosting infrastructure
If the globe feels sluggish - especially on tablets or with wind and precipitation layers active - two settings in the options dialog help:
- Frame rate limit - set to 30 fps. Gives the GPU twice the time per frame.
- Downscale - set to 2×. Renders at half resolution, the globe looks slightly softer but interaction becomes much smoother.
Combined, these make even demanding layer combinations usable on mobile devices.
- Alpha software - expect rough edges
- WebGPU only - won't work on older browsers
- Chrome reload bug - repeated F5 can cause adapter loss; restart browser if screen goes blank (Chrome bug #469455157)
- Bandwidth - first load ~100-500MB depending on exploration; Service Worker caches for instant subsequent visits
- Forecast accuracy - displays ECMWF data but cannot guarantee correctness; consult official weather services for critical decisions
Services like Windy.com and Weather.com excel at polished UX, multi-model comparison, social features, and mobile apps. Zero focuses on hazard assessment and architectural independence for climate adaptation contexts where infrastructure matters more than feature richness.
Different missions, both valuable.
MIT - see LICENSE
See CONTRIBUTING.md
Disclaimer: Weather forecasts are probabilistic. Zero is provided "as is" without warranty. Not affiliated with or endorsed by ECMWF, Open-Meteo, or AWS.

