wesleygrimes/omastorm

An Omarchy-native NEXRAD radar viewer built with Rust and Quickshell.

Rust

98

80 commits

updated Sep 15, 2026

See the code
hyprland
linux
nexrad
noaa
omarchy
omarchy-plugin
qml
quickshell
radar
rust
wayland
weather
weather-radar

README

Omastorm

Live NEXRAD radar in your Omarchy bar. Beta.

Omastorm window and bar popover

A radar that lives next to the clock. The popover is the station nearest you and the actual scan time. Click the map (or press Enter) for the full window: every dish in the network, the sweep at native resolution, a two-hour loop you can play and scrub, drawn in your Omarchy theme.

This page is the user guide: install, first run, and everyday use. How the code is built lives in CONTRIBUTING.md.

Install

Omarchy 4 on x86_64 and aarch64.

omarchy plugin add https://github.com/wesleygrimes/omastorm.git --enable

That clones the plugin, asks which bar section to use, and on first open downloads the pinned engine from GitHub Releases, checks its sha256, and installs it under ~/.local/share/omastorm/bin. Configuration, remembered view, and cached scans stay in Omastorm's own directories.

Optional: a Hyprland key to toggle the window. 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 '{}'")

Optional: list it in the app launcher:

bash ~/.config/omarchy/plugins/com.omastorm.radar/scripts/write-desktop-entry.sh

First run

Open the popover from the bar. If Omarchy weather already has a city, the map opens there. If not, you get a choice: pick a place, or use an approximate location.

Choose your location

Use approximate location is one click. It asks wttr.in to guess your city from the public IP of that request. Nothing is sent until you click; there is no GPS and no background tracking. A VPN or CGNAT may land you at the ISP instead of your house. Choose manually if the guess is wrong.

The view is remembered. Next time you open the popover, you are back where you left off.

What you are looking at

NEXRAD is NOAA's network of weather radars. Each dish spins, sends a pulse, and measures how much bounced back. Omastorm shows reflectivity on the lowest tilt: the beam that stays closest to the ground.

Color is dBZ, not a rain rate and not a warning. Stronger return, warmer color. The legend under the map is that scale.

A bright blob is often rain or snow. The same beam also sees:

  • insects, birds, and bats (especially on clear evenings)
  • dust, smoke, and sea spray
  • ground clutter and buildings near the dish
  • anomalous propagation, when the beam bends and paints the ground far away
  • wind farms, towers, and military chaff

Measured returns under 5 dBZ (the usual biological clutter and haze) are hidden by default; the legend says so. Press w to show them.

This is not a forecast, and it is not the NWS warning stack. It is the sweep that dish published, with the scan time on the stamp.

The window

Drag to pan, scroll to zoom. The map and the radar are independent: panning moves the camera; the dish is whichever station the map is following, unless you lock it.

Click the station name for nearby dishes. The padlock pins that radar so panning will not hand off; it turns yellow when the camera sits outside that dish's rings. n picks the nearest radar and leaves the camera where it is.

The number under the product line is how stale the frame on screen is. The stamp above the timeline is when that sweep was observed. LIVE is the feed; the light beside it goes yellow when data is stale (ten minutes) and red when the station or the bucket is unreachable. Cached frames stay.

A scale bar on the map is ground distance, in kilometres or miles from your locale.

/ (or s) is one field. Type a city, a site id, or paste coordinates.

A city centres the map there, unlocks, and selects the nearest radar.

Search a city

A site (KTLX, tlx) locks that dish and centres on it. Clicking the station title opens the same card on the nearest dishes.

Search a radar site

Coordinates are latitude then longitude, decimal degrees, comma or space, the way a maps link looks. Invalid range is named on the card; the layout does not jump.

Paste coordinates

Coordinates out of range

My location

The map-marker at the top-left of the map, or m, jumps to the same approximate IP location as first run. Zoom stays. The radar unlocks and follows. Archived sessions never locate.

If the lookup fails, the camera stays put and a short overlay appears on the map. It is not a new row of chrome.

Approximate location failed

The loop

A station you arrive at fetches recent scans so there is something to play within a few seconds. The cache then grows toward 60 frames / two hours. Older scans drop out. Space loops them; [ ] steps; Home and End jump.

NOAA publishes Level II via the Open Data program on AWS. A full volume takes about four to seven minutes (faster in severe weather, slower in clear air). While a volume is in progress the engine reads live chunks, so the sweep can paint as the antenna turns. If no new chunk arrives for 90 seconds it rediscovers the latest volume; cached frames stay.

Look

Three treatments sample the same gate and palette. They only change how each 3 px cell is painted. Glyphs is the default; 1 2 3 switch.

KeyTreatmentLook
1PixelsSolid blocks. The most literal picture of each gate.
2GlyphsA denser mark as the return strengthens.
3StippleSoft squares that grow with intensity; more map shows through.

Pixels, Glyphs, and Stipple

Chrome follows the Omarchy theme. Radar color comes only from the sweep.

Tokyo Night and Flexoki Light

? lists every key. They are all rebindable.

KeyAction
h j k l or arrowsPan
+ -Zoom
0Reset to the configured or weather location
/ or sSearch
nNearest radar (camera stays)
Shift+LLock the station
mMy location
SpacePlay / pause the loop
[ ]Step a frame
Home / EndOldest or newest frame
1 2 3Pixels, Glyphs, Stipple
wShow weak returns
?This map
EscClose

Preferences

~/.config/omastorm/config.toml is what you mean to keep. The last map center, zoom, and UI radar lock are saved separately in ~/.local/state/omastorm/state.json. Panning never rewrites config.

# Optional: always open here. Omit both to remember the last map position.
center_lat = 36.23708
center_lon = -79.97948
# locked_radar = "KFCX"  # optional; coordinates do not lock a radar

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. Keys are Qt sequences; an empty string unbinds. The 1 2 3 and w keys change treatment and the weak-return floor for the session without writing the file.

Update

omarchy plugin update com.omastorm.radar
omarchy restart shell

Until the restart, the shell keeps running what it loaded at login, old engine pin included. Omastorm notices the new files and says so; clicking that notice in the popover restarts the shell.

If something is wrong

If expand or the keybind does nothing after an update, restart the shell.

The engine is one daemon per login. Its log is $XDG_RUNTIME_DIR/omastorm/engine.log (usually /run/user/<uid>/omastorm/). If the engine could not be installed, the reason is bootstrap.log in the same directory; opening the popover again retries.

~/.local/share/omastorm/bin/omastorm-engine stop

The next popover or window starts it again.

This is a beta. Bugs, rough edges, and ideas go to GitHub issues. For a failure, use the bug report template and attach the last screenful of engine.log (and bootstrap.log if the engine never installed). Include Omarchy version, plugin commit, and GPU as the template asks.

Remove

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                            # keep this to reinstall later
rm -f ~/.local/share/applications/omastorm.desktop   # if you added the launcher entry

Then delete the o.bind line if you added one.

Data

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. Approximate location: wttr.in. Code: MIT, see LICENSE.

Contributing

Setup, checks, and pull requests are in CONTRIBUTING.md. Read DESIGN.md before proposing a product change. Open work that is ready for a first patch is labeled good first issue and help wanted.

Contributors

Thanks to these people (emoji key):

This project follows the all-contributors specification.

Contributors

wesleygrimes

70 commits

shieldsworks

2 commits

airtwo

1 commits

wesleygrimes/omastorm

An Omarchy-native NEXRAD radar viewer built with Rust and Quickshell.

Rust

98

80 commits

updated Sep 15, 2026

See the code
hyprland
linux
nexrad
noaa
omarchy
omarchy-plugin
qml
quickshell
radar
rust
wayland
weather
weather-radar

README

Omastorm

Live NEXRAD radar in your Omarchy bar. Beta.

Omastorm window and bar popover

A radar that lives next to the clock. The popover is the station nearest you and the actual scan time. Click the map (or press Enter) for the full window: every dish in the network, the sweep at native resolution, a two-hour loop you can play and scrub, drawn in your Omarchy theme.

This page is the user guide: install, first run, and everyday use. How the code is built lives in CONTRIBUTING.md.

Install

Omarchy 4 on x86_64 and aarch64.

omarchy plugin add https://github.com/wesleygrimes/omastorm.git --enable

That clones the plugin, asks which bar section to use, and on first open downloads the pinned engine from GitHub Releases, checks its sha256, and installs it under ~/.local/share/omastorm/bin. Configuration, remembered view, and cached scans stay in Omastorm's own directories.

Optional: a Hyprland key to toggle the window. 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 '{}'")

Optional: list it in the app launcher:

bash ~/.config/omarchy/plugins/com.omastorm.radar/scripts/write-desktop-entry.sh

First run

Open the popover from the bar. If Omarchy weather already has a city, the map opens there. If not, you get a choice: pick a place, or use an approximate location.

Choose your location

Use approximate location is one click. It asks wttr.in to guess your city from the public IP of that request. Nothing is sent until you click; there is no GPS and no background tracking. A VPN or CGNAT may land you at the ISP instead of your house. Choose manually if the guess is wrong.

The view is remembered. Next time you open the popover, you are back where you left off.

What you are looking at

NEXRAD is NOAA's network of weather radars. Each dish spins, sends a pulse, and measures how much bounced back. Omastorm shows reflectivity on the lowest tilt: the beam that stays closest to the ground.

Color is dBZ, not a rain rate and not a warning. Stronger return, warmer color. The legend under the map is that scale.

A bright blob is often rain or snow. The same beam also sees:

  • insects, birds, and bats (especially on clear evenings)
  • dust, smoke, and sea spray
  • ground clutter and buildings near the dish
  • anomalous propagation, when the beam bends and paints the ground far away
  • wind farms, towers, and military chaff

Measured returns under 5 dBZ (the usual biological clutter and haze) are hidden by default; the legend says so. Press w to show them.

This is not a forecast, and it is not the NWS warning stack. It is the sweep that dish published, with the scan time on the stamp.

The window

Drag to pan, scroll to zoom. The map and the radar are independent: panning moves the camera; the dish is whichever station the map is following, unless you lock it.

Click the station name for nearby dishes. The padlock pins that radar so panning will not hand off; it turns yellow when the camera sits outside that dish's rings. n picks the nearest radar and leaves the camera where it is.

The number under the product line is how stale the frame on screen is. The stamp above the timeline is when that sweep was observed. LIVE is the feed; the light beside it goes yellow when data is stale (ten minutes) and red when the station or the bucket is unreachable. Cached frames stay.

A scale bar on the map is ground distance, in kilometres or miles from your locale.

/ (or s) is one field. Type a city, a site id, or paste coordinates.

A city centres the map there, unlocks, and selects the nearest radar.

Search a city

A site (KTLX, tlx) locks that dish and centres on it. Clicking the station title opens the same card on the nearest dishes.

Search a radar site

Coordinates are latitude then longitude, decimal degrees, comma or space, the way a maps link looks. Invalid range is named on the card; the layout does not jump.

Paste coordinates

Coordinates out of range

My location

The map-marker at the top-left of the map, or m, jumps to the same approximate IP location as first run. Zoom stays. The radar unlocks and follows. Archived sessions never locate.

If the lookup fails, the camera stays put and a short overlay appears on the map. It is not a new row of chrome.

Approximate location failed

The loop

A station you arrive at fetches recent scans so there is something to play within a few seconds. The cache then grows toward 60 frames / two hours. Older scans drop out. Space loops them; [ ] steps; Home and End jump.

NOAA publishes Level II via the Open Data program on AWS. A full volume takes about four to seven minutes (faster in severe weather, slower in clear air). While a volume is in progress the engine reads live chunks, so the sweep can paint as the antenna turns. If no new chunk arrives for 90 seconds it rediscovers the latest volume; cached frames stay.

Look

Three treatments sample the same gate and palette. They only change how each 3 px cell is painted. Glyphs is the default; 1 2 3 switch.

KeyTreatmentLook
1PixelsSolid blocks. The most literal picture of each gate.
2GlyphsA denser mark as the return strengthens.
3StippleSoft squares that grow with intensity; more map shows through.

Pixels, Glyphs, and Stipple

Chrome follows the Omarchy theme. Radar color comes only from the sweep.

Tokyo Night and Flexoki Light

? lists every key. They are all rebindable.

KeyAction
h j k l or arrowsPan
+ -Zoom
0Reset to the configured or weather location
/ or sSearch
nNearest radar (camera stays)
Shift+LLock the station
mMy location
SpacePlay / pause the loop
[ ]Step a frame
Home / EndOldest or newest frame
1 2 3Pixels, Glyphs, Stipple
wShow weak returns
?This map
EscClose

Preferences

~/.config/omastorm/config.toml is what you mean to keep. The last map center, zoom, and UI radar lock are saved separately in ~/.local/state/omastorm/state.json. Panning never rewrites config.

# Optional: always open here. Omit both to remember the last map position.
center_lat = 36.23708
center_lon = -79.97948
# locked_radar = "KFCX"  # optional; coordinates do not lock a radar

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. Keys are Qt sequences; an empty string unbinds. The 1 2 3 and w keys change treatment and the weak-return floor for the session without writing the file.

Update

omarchy plugin update com.omastorm.radar
omarchy restart shell

Until the restart, the shell keeps running what it loaded at login, old engine pin included. Omastorm notices the new files and says so; clicking that notice in the popover restarts the shell.

If something is wrong

If expand or the keybind does nothing after an update, restart the shell.

The engine is one daemon per login. Its log is $XDG_RUNTIME_DIR/omastorm/engine.log (usually /run/user/<uid>/omastorm/). If the engine could not be installed, the reason is bootstrap.log in the same directory; opening the popover again retries.

~/.local/share/omastorm/bin/omastorm-engine stop

The next popover or window starts it again.

This is a beta. Bugs, rough edges, and ideas go to GitHub issues. For a failure, use the bug report template and attach the last screenful of engine.log (and bootstrap.log if the engine never installed). Include Omarchy version, plugin commit, and GPU as the template asks.

Remove

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                            # keep this to reinstall later
rm -f ~/.local/share/applications/omastorm.desktop   # if you added the launcher entry

Then delete the o.bind line if you added one.

Data

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. Approximate location: wttr.in. Code: MIT, see LICENSE.

Contributing

Setup, checks, and pull requests are in CONTRIBUTING.md. Read DESIGN.md before proposing a product change. Open work that is ready for a first patch is labeled good first issue and help wanted.

Contributors

Thanks to these people (emoji key):

This project follows the all-contributors specification.

Contributors

wesleygrimes

70 commits

shieldsworks

2 commits

airtwo

1 commits

Languages

Rust

47.3%

QML

23.8%

Shell

20.5%

JavaScript

3.2%

HTML

2.7%

Python

1.3%

GLSL

1.2%