Open-source, live NEXRAD radar for the Omarchy desktop. Beta.
Live KJAX demo: playback, pan and zoom, treatments, weak returns, station search, and keyboard controls.
A radar that lives in your bar. The popover shows the station nearest you with the actual scan time. Expand it for the full window: every NEXRAD site in the network, reflectivity at native resolution, a timeline you can scrub, all drawn in your Omarchy theme.
A headless Rust engine fetches and decodes NEXRAD Level II data and prepares GPU-ready radar textures. An Omarchy plugin built with Quickshell/QML is the client: it displays those textures in the bar popover and full window.
- Live. A Rust engine polls NOAA's public Level II feed and sweeps paint as the antenna turns. Stale data says it is stale.
- Every site. Pan the map and it follows the nearest station, or search by id, city, or state.
- Timeline. Up to 60 scans per station, cached locally. Play, step, scrub.
- Three treatments. Glyphs, Pixels, and Stipple sample the same gate and paint the cell differently.
- Native. Colors, font, and spacing come from the active Omarchy theme and change with it.
- Keyboard first. Everything the pointer reaches is a keystroke, and every key is rebindable.
- Honest. Actual scan times. Missing, range-folded, and below-threshold returns are drawn distinctly from measured values. Displays individual radar sweeps.
Omarchy 4 on x86_64 and aarch64.
omarchy plugin add https://github.com/wesleygrimes/omastorm.git --enableThis clones the plugin into ~/.config/omarchy/plugins/com.omastorm.radar and
asks which bar section to use. The first time the popover opens it downloads
the pinned engine binary from this repository's GitHub Releases, verifies its
sha256 against engine/release.pin, and installs it under
~/.local/share/omastorm/bin. Runtime files, cached data, remembered view state, and configuration stay
inside Omastorm's own directories.
On first use, Omastorm uses your Omarchy weather location when available; otherwise it prompts you to search for a place or enter coordinates. To set a fixed launch location, including during agent-assisted installation, see configuration and remembered state.
To open the window from the keyboard, add one line to
~/.config/hypr/bindings.lua. Omastorm never writes that file.
o.bind("SUPER + SHIFT + R", "Omastorm", "omarchy shell shell toggle com.omastorm.radar '{}'")To list Omastorm in the app launcher:
bash ~/.config/omarchy/plugins/com.omastorm.radar/scripts/install-launcher.shUpdate with omarchy plugin update com.omastorm.radar.
Click the mark in the bar for the popover: the map at your location, LIVE or the connection condition, the actual scan time, step and play, and EXPAND. If no location is known, the popover offers “Choose a location,” which opens the picker in the window. Click the radar or press Enter for the window; it opens on the same station, frame, and camera. Closing preserves your view for the next launch.
In the window, drag to pan and scroll to zoom. The map follows the nearest station as you pan unless you lock it; a locked radar stays put even when the camera leaves its coverage. A station you arrive at fetches its last dozen scans, so there is a loop to play within a few seconds; the cache then grows to 60 as new scans arrive. The status slot shows the age of the frame on screen: LIVE, STALE after ten minutes, UNAVAILABLE or OFFLINE when the feed cannot be reached, with cached frames kept.
| Key | Action |
|---|---|
h j k l or arrows |
Pan |
+ - |
Zoom |
0 |
Reset to the configured or weather location |
/ or s |
Search sites (center and lock) |
n |
Nearest site |
Shift+L |
Lock the station |
Shift+H |
Choose a location |
Space |
Loop the frames |
[ ] |
Step a frame |
Home End |
Oldest or newest frame |
1 2 3 |
Pixels, Glyphs, Stipple |
w |
Show weak returns |
? |
Keys sheet |
Esc |
Close |
Measured returns under 5 dBZ (insects, birds, ground clutter on a clear day)
are hidden by default and the legend says so; w shows them.
~/.config/omastorm/config.toml holds deliberate preferences. The app saves
last map center, zoom, and UI radar lock separately in
$XDG_STATE_HOME/omastorm/state.json (default
~/.local/state/omastorm/state.json). Navigation never rewrites your config.
Shift+H, or LOCATION, opens the location picker; it writes state, not config.
Explicit center coordinates win on every launch. Without them, Omastorm restores your last view, then falls back to the weather location or location picker. Radar selection is independent: a configured lock wins, otherwise a remembered lock is restored, otherwise the nearest radar follows the map.
# Optional: always open here. Omit both to remember the last map position.
center_lat = 36.23708
center_lon = -79.97948
# locked_radar = "KFCX" # optional radar override; coordinates do not imply a lock
treatment = "GLYPHS" # PIXELS, GLYPHS, or STIPPLE at launch
weak_floor = 5 # dBZ; false draws every measured return
[keys]
pan_left = "h Left"
zoom_in = "+ ="A bad value is named in the status slot and that setting stays on its default. Every action name, the key syntax, and what each setting does are in docs/configuration.md.
If expand or the keybind does nothing after omarchy plugin update, the
shell still has the previous QML types. Restart it:
omarchy restart shellThe engine runs as one shared daemon per login. Its log is
$XDG_RUNTIME_DIR/omastorm/engine.log (usually /run/user/<uid>/omastorm/).
If the popover says the engine could not be installed, the download or its
sha256 check failed; the reason is in bootstrap.log in the same directory,
and opening the popover again retries. To restart the engine by hand:
~/.local/share/omastorm/bin/omastorm-engine stopThe next popover or window starts it again. Please attach both logs to a bug report.
omarchy plugin remove com.omastorm.radar
~/.local/share/omastorm/bin/omastorm-engine stop
rm -rf ~/.local/share/omastorm ~/.cache/omastorm ~/.local/state/omastorm
rm -rf ~/.config/omastorm # your config.toml; keep it to reinstall later
rm -f ~/.local/share/applications/omastorm.desktop # if you added the launcher entryThen delete the o.bind line if you added one.
This is a beta. Bugs, rough edges, and ideas go to GitHub issues.
Radar: NOAA NEXRAD Level II via the NOAA Open Data program on AWS. Basemap: © OpenStreetMap contributors, ODbL, tiles by OpenFreeMap; Natural Earth, public domain. Location search: GeoNames, CC BY 4.0. Code: MIT, see LICENSE.
This is a beta. Contributions are welcome.
CONTRIBUTING.md is setup, checks, and pull requests.
Open work that is ready for a first patch is labeled
good first issue
and help wanted.
A headless Rust engine serves GPU textures over a Unix socket. The
Quickshell UI is the client. manifest.json is the Omarchy plugin.
engine/Rust daemon: NEXRAD decode, cache, and the socket protocolui/Quickshell QML for the bar popover and windowscripts/setup, checks, captures, install, and releasedata/fixture provenance, checksums, and vendored archives (data/raw/is extracted)golden/decoder answer key for the archived KTLX scandocs/protocol, configuration, and releasingsite/omastorm.com
Read DESIGN.md before proposing a product change and docs/protocol.md before touching the engine/client boundary. Maintainers cut releases with docs/RELEASING.md.


