A browser-based workbench for visualizing and analyzing NEXRAD (WSR-88D) weather radar data. Built with Rust, compiled to WebAssembly, and runs entirely client-side with no backend services.
Live site: https://danielway.github.io/nexrad-workbench/
- Archive browsing — Browse and download historical radar data from AWS S3
- Real-time streaming — Stream live radar data as the radar produces it
- Local file upload — Open local Archive II files for offline analysis
- Multiple radar products — Reflectivity, Velocity, Spectrum Width, Differential Reflectivity, Correlation Coefficient, Differential Phase, Clutter Filter Power
- Interactive timeline — Zoomable timeline with data availability visualization, playback controls, and variable-speed animation
- Geographic overlays — State boundaries, county boundaries, and city labels
- 3D visualization — Globe view with volumetric ray-marching renderer
- Storm cell detection — Automated detection with configurable thresholds
- Measurement tools — Inspector (lat/lon + data values) and distance measurement
- Persistent caching — IndexedDB-backed cache with configurable storage limits
- Keyboard shortcuts — Full shortcut set for power users (press
?to view) - Dark and light themes — Follows OS preference with manual override
rustup target add wasm32-unknown-unknown
cargo install --locked trunkStart the development server:
trunk serveThis opens a local server at http://127.0.0.1:8080 with hot reloading.
Build for production:
trunk build --releaseOutput is written to the dist/ directory.
The project automatically deploys to GitHub Pages on push to main. The CI pipeline:
- Checks formatting (
cargo fmt) - Lints with Clippy (
clippy -D warnings) - Builds the WASM bundle with Trunk
- Deploys to GitHub Pages
| Category | Stack |
|---|---|
| Language | Rust 2021, compiled to WebAssembly |
| UI framework | eframe/egui 0.33 |
| Graphics | WebGL2 via glow 0.16 |
| NEXRAD data | nexrad, nexrad-data, nexrad-decode, nexrad-model, nexrad-render crates |
| Browser APIs | wasm-bindgen, web-sys, js-sys |
| Build tool | Trunk |
| CI/CD | GitHub Actions |
The application uses a Fat Worker pattern: all expensive data operations (bzip2 decompression, NEXRAD decode, sweep extraction, IndexedDB I/O) run in a dedicated Web Worker, keeping the main thread as a thin UI shell. Radar data is pre-computed into sweep blobs during ingestion and stored in IndexedDB, giving near-zero render latency for scrubbing and elevation changes. A service worker provides cross-origin isolation headers (COOP/COEP) and network metric collection.
See ARCHITECTURE.md for technical details. See the docs/ directory for product specifications.

