Repository navigation
Releases: RiotTheClanker/radar-app
Release list
v0.3.2
Future radar removed
The Future radar tool, the fast-forward button that extrapolated the
latest scans up to 60 minutes ahead, has been taken out. It ran, but where it
put the storms was not accurate enough to be worth showing. The radar now
always shows real scans. Storm tracks are unchanged: their forecast positions
are the NWS's own, not the app's.
What's Changed
- Remove the future radar (storm prediction) feature by @RiotTheClanker in #61
- Release v0.3.2 by @RiotTheClanker in #62
Full Changelog: v0.3.1...v0.3.2
v0.3.1
TDWR airport radars
The engine now decodes the FAA's Terminal Doppler Weather Radar products —
base reflectivity (TZ0–2), velocity (TV0–2) and long-range reflectivity
(TZL). TDWRs sit at 45 US airports: short range (about 90 km), but a narrow
beam, 150 m gates and a fast update, so they are much sharper than NEXRAD
close to the metro areas they cover. Install the TDWR addon (below) to
add them to the map and the radar picker; they are never chosen as the
startup radar.
Ready-made addons
Four addons are now published for installing from a link in Tools →
Addons: TDWR airport radars; map reference layers (US county and state
lines, place names and roads over the radar, hillshade under it);
hurricanes, wildfires and earthquakes (NHC cones and tracks, large US fire
perimeters, M2.5+ quakes); and extra themes (Night red, High contrast, OLED
black). Paste one of these links into Tools → Addons and press Install:
- TDWR airport radars —
https://raw.githubusercontent.com/RiotTheClanker/radar-app/main/docs/addons/catalog/tdwr.json - Map reference layers —
https://raw.githubusercontent.com/RiotTheClanker/radar-app/main/docs/addons/catalog/map-layers.json - Hurricanes, wildfires and earthquakes —
https://raw.githubusercontent.com/RiotTheClanker/radar-app/main/docs/addons/catalog/hazards.json - Extra themes —
https://raw.githubusercontent.com/RiotTheClanker/radar-app/main/docs/addons/catalog/themes.json
Addon format
New, and available to anyone's addon: wms overlays; simplify, to thin
heavy GeoJSON feeds as they load; bounds, to keep a layer from being
fetched where it has nothing; refreshMinutes for tile and WMS layers; a
site products map for radars that name their products differently; and
"enabled": false for an addon that should wait to be switched on.
Faster addon overlays
GeoJSON overlays are now parsed off the main thread, and the map reuses the
shapes it built instead of rebuilding them on every frame. A large live feed
no longer slows the whole app while its layer is on.
What's Changed
- Release v0.3.1: TDWR support, ready-made addons, faster overlays by @RiotTheClanker in #60
Full Changelog: v0.3.0...v0.3.1
v0.3.0
Addons
The app now takes addons: JSON files that add what it does not ship for
everyone. A county's roads and shelters, a university radar nobody put on
AWS, a chase team's own tile server, a red theme for night driving. An addon
is data, never code — nothing in one runs.
One addon can add any mix of:
- Radar sites, with their own data. A site's files can come from any
S3-compatible bucket (the same protocol NOAA's use, and what MinIO, R2 and
Wasabi answer to), from any web folder that lists its files — nginx with
autoindex onis enough — or from a folder on your own device, such as
a receiver's output directory. Headers can be set for a source that needs
a key. An addon can also re-point an existing site, such as KTLX, at a
mirror. - Your own parser, for any radar format. NEXRAD files are decoded by the
app. For anything else there is now an open radar format: a small,
documented JSON description of a sweep (site, radials, gates, values) or
of a lat/lon grid. Your converter, in any language, writes it; the app
draws it with its own palettes (including imported.palfiles), colour
key, aiming cursor, loops and replay. A file can bring its own colour
scale for data no radar palette fits. A standard-library Python writer is
intools/open_format/radar_open.py, and an example addon reads
synthetic sample files from a local folder with no network at all. - Map overlays. GeoJSON — from a file, a URL (optionally refreshed every
few minutes, for live positions), or written inline — and tile layers.
Each chooses whether it sits under the radar, like imagery, or over it,
like roads and boundaries. Per-feature colours follow the simplestyle
convention that geojson.io and most exporters already write. - Places. Shelters, spotter posts, schools, home — from a list in the
file or a CSV. Tap one for its range and bearing from the radar and how
high the beam is over it, which is the answer to "why doesn't the radar
show the rotation I can see from here". - Themes for the chrome — bars, menus, text — never the radar, whose
colours are data. An example all-red night-vision theme is included. - Colour tables:
.palfiles that join the Tools menu's list.
Install from a link in Tools → Addons, or drop files in
~/.config/taa-yuku-radar/addons/. Each addon has an on/off switch, and
anything the loader skipped is listed under it with the reason — a mistake
in one item costs that item, not the whole addon. Overlays and place groups
are switched on and off in Layers → ADDONS, themes in Tools → THEME.
Your choices are remembered between runs.
An addon's radar is drawn as a diamond rather than a dot and carries its
addon's name in the radar picker, and its owner's credit is on the map while
you are on it, the same as the basemap's. The format is documented in
docs/addons.md, with examples in
docs/addons/examples.
Fixes
- A radar that failed to load no longer shows the previous radar's
picture. Switching to a site whose data could not be fetched left the
old site's frames on screen under the new site's name. The pane is now
cleared, and says why. - With one pane, a load error is now visible. The error only ever
appeared in the pane header, which is not drawn in the single-pane layout,
so a radar that failed to load looked like a radar with nothing to show.
The status bar now carries a LOAD FAILED chip; tap or hover it for the
reason.
What's Changed
- Add addons: custom radar sites and sources, overlays, places and themes by @RiotTheClanker in #59
Full Changelog: V0.2.0...v0.3.0
v0.2.0
The biggest release so far, and the reason it is 0.2.0 rather than the next
0.1.x: the whole screen has been rebuilt, two new map layers arrive, and a
fault that made the 3D view unusable in the mountains is fixed.
The workspace
The old screen floated rounded translucent cards over a single map, which
reads as a phone app: it spends space on padding and corner radius, and the
products you switch between constantly sit one popup menu deep. It is now
laid out the way a radar workstation is — thin solid strips docked to the
edges, square corners, small type, the common products on the bar as one
click.
You can open up to four panes: one, two across, two down, or a 2x2. Panes
share a site and pan together by default, since the reason to open four is
almost always one storm in four products — so the four-pane layout opens on
reflectivity, velocity, ZDR and correlation coefficient over the same radar.
Toolbar actions land on whichever pane has focus.
Sharing is not cosmetic. Four panes each polling for alerts and each holding
their own lightning connection would be four times the network for one
answer, and four animation clocks would drift apart, which defeats putting
two products side by side in the first place.
Two things that came out of it: renders are now sized to the pane rather than
the window, which in a 2x2 had been asking for four times the pixels needed;
and a cold start no longer fetches the fallback site's data and throws it
away when geolocation resolves — for a Level 2 product that was 10 MB per
pane.
Radar sites used to be reachable only by finding their dot on the map. There
is now a picker that matches on id, name or state.
Two new layers
Surface observations. Temperature, dewpoint, wind and pressure from the
METAR network, drawn as station plots. One observation record carries all
four, so this is a measurement rather than an analysis. A station that has
stopped reporting is dimmed rather than left looking current.
CAPE, from the HRRR model. How much energy is available to a rising
parcel of air, in joules per kilogram — the field that separates air that
could produce a storm from air that cannot. This is the one thing here that
genuinely cannot come from observations: it needs a vertical profile at every
point, and the radiosonde network launches seventy balloons twice a day.
It is fetched as an 800 KB byte range out of the 130 MB hourly file rather
than the whole thing, using the index sidecar that names where each field
starts.
It is labelled as a forecast everywhere it appears. Everything else in
this app was seen by an instrument. This was computed, and drawn at the same
apparent confidence next to live warnings it would be read as an observation
by someone deciding whether to shelter. So the layer sits under a MODEL
heading rather than with the observations, the menu entry and the attribution
line both name the model run it came from, and a stale run says so.
Fixed
3D terrain floated above the storm, by the radar's own altitude. Echo
heights are measured from the antenna; the terrain arrived as metres above
sea level and went in untouched. Same vertical axis, two different origins,
and the 4x vertical exaggeration multiplied the gap:
KICX Cedar City UT 3278 m → 13.1 km of mountain on top of the volume
KBYX Key West FL 26 m → 0.1 km, invisible
At Cedar City the terrain buried the storm; in Florida you would never have
noticed. Testing near Norman is why it went unseen for so long. The radar's
height now comes out of the volume file itself, so the ground sits at the
storm's feet and valleys below the radar are still drawn.
Radar data never refreshed. A pane left open showed the weather from the
moment it opened — new data was only ever fetched when you opened a pane or
changed something. There is now a refresh clock: a tick lists the newest scan
and compares it against what is on screen, so a quiet minute costs one
listing and no download.
The dark basemap said "API KEY REQUIRED" across it. CARTO began gating
anonymous requests behind a key, and answered with a real PNG that had the
notice drawn into it — so nothing downstream could tell it from a map.
Replaced with Esri's Dark Gray Canvas, which is keyless.
Startup picked a radar that publishes nothing. It chose the geometrically
closest site, which near Norman is a research radar with no public feed, and
then another one. The nearest sites are now probed rather than trusted, with
a timeout, falling back to the closest if none answer.
Two panes fought over the cursor readout. The aiming cursor keeps a
decoded sweep open in the engine, and that was one slot for the whole app —
so the second pane to switch its cursor on took the first pane's over. In a
reflectivity-vs-velocity layout that put a velocity number under a
reflectivity label, with nothing on screen saying so.
Overlapping warnings. Tapping where two alerts overlap opened one of them
and silently discarded the rest. It now offers the list of everything under
your finger, each one openable.
Radar site dots were nearly impossible to hit. A 10-pixel target drawn in
white at 24% opacity, on a dark basemap, under a translucent radar overlay,
outdoors at night. The invisible tap box around each dot is now
three times as wide while the dot itself stays small — two hundred
fingertip-sized circles would have buried the weather under them.
The Android APK was built against an NDK nobody asked for, which happened
to be present on the CI runner. One version now feeds both halves of the
build so they cannot drift apart again.
Reading the sounding
Every number on the sounding plot was bare: pressures without hPa, isotherms
without degrees, wind without knots. Each axis now names its unit, the traces
are spelled out, and the indices panel says what each abbreviation stands for
and what it measures.
What it deliberately does not say is what a value means for this afternoon.
Explaining what CAPE measures is help; telling you a number means a tornado
is a forecast, from an app whose own README says not to rely on it.
Launch sites were a popup of seventy in table order. They are now ordered
outward from wherever you are looking, with the distance beside each name.
Colour keys
Hydrometeor classification gets a list of its classes down the side of the
map, where the colour scale usually goes, since a scale labelled with class
ids is not something you can read a value off. The colours are the NWS's own,
which are not the ones our 3D classifier uses — a legend drawn with the wrong
palette would name every class incorrectly, so a test checks it against the
table the map is actually painted with.
The 3D view now has a key for every field, not just the classified one: a
scale in that field's own units for reflectivity, wind, ZDR and correlation
coefficient, and the class list for classification. It is built from the same
table the renderer painted with, so an imported .pal changes it too.
One thing it does not show for the continuous fields: the opacity slider
makes weak values transparent in 3D, and the key still lists them. It says
what a colour means, not what is currently visible.
The key is the filter, for hydrometeor classification
The 3D filter used to be a switch: everything, or everything except clutter
and biological. Now every class in the key is its own switch — tap it to hide
that class, tap it again to bring it back. Hide everything but graupel and
hail and you are looking at the updrafts.
Per class rather than a slider because the classes have no natural order to
slide along. Any threshold would have to invent one, and would then only
reach the combinations that ordering happened to allow; "graupel and hail,
but not the snow below them" is not a prefix of anything.
A hidden class stays in the key, greyed and struck through, rather than
disappearing. You can see what you cut, you can tell it apart from a class
the radar never saw, and the row is still there to switch back on. "Show all"
at the top clears the lot.
Much better classification, from checking it against the NWS
Comparing our answer to theirs at the four tilts they publish turned up three
real faults, none of which was visible by eye:
The melting level could land on the ground. It is found from the volume's own
correlation-coefficient dip, and overnight the boundary layer fills with
insects, whose correlation coefficient is worse than any melting snow. On a
3am volume that put the melting level at 200 m and called the whole volume
ice. The dip must now be above 1 km and be a genuine layer, cleaner above and
below.
Insects and ground clutter were tied to the freezing level, which has nothing
to do with either. They are now placed by height above ground.
Correlation coefficient carried the least weight of the three moments, when
it is the best single indicator of whether a return is weather at all.
Agreement went from 8% to 78.9% averaged over ten radars from Florida to
Washington, ranging 66% to 95%; six of those sites were never used while
tuning and average 83.6%. Biological returns alone went from 35% to about
80%.
It still runs without the KDP and texture fields the operational algorithm
uses, and that shows: ground clutter it gets wrong more often than right, and
it is weakest over widespread stratiform ice. Good for reading storm
structure; not a substitute for the operational product.
Faster
The engine's hot paths were measured rather than guessed at, and then worked
on where the time actually was:
- **Level 2 volumes decompress across thre...
v0.1.4
Fixed
Thin black spokes through Level 2 data (#28). Each radial claimed a slice
of azimuth as wide as it reported itself to be, which tiles perfectly for
Level 3 — exactly one degree, on whole degrees — but not for Level 2.
Super-resolution start azimuths drift, so one radial would cover 10.0-10.5°
while the next started at 10.57°, and the sliver between belonged to nobody.
Every such sliver drew as a black line radiating from the radar. The 3D view
had the same holes, as empty columns through the volume.
Slivers now go to whichever neighbouring radial is nearer, but only across
gaps under two degrees, so a sector the radar genuinely did not scan stays
empty instead of being filled with invented coverage.
Storm tracks
The NWS's own storm cells, from the Level 3 STI product: each cell's id and
position, how fast and which way it is moving, its forecast track out to an
hour, and the NWS's own estimate of how wrong that track is likely to be.
It is its own overlay, so it draws over velocity, ZDR or correlation
coefficient exactly as over reflectivity. Tap a cell for detail. A cell the
NWS has no movement solution for yet is drawn hollow and marked new rather
than given an invented arrow.
These are NOAA's numbers, not ours. Their SCIT runs across seven reflectivity
thresholds with full vertical integration, which no single-threshold reading
of one 2D field on device could match.
Rotation and tornado signatures
Mesocyclone detections ride along with the storm tracks overlay, from the
NWS's own Mesocyclone Detection Algorithm: where the rotation is, how strong,
its peak rotational velocity, and which storm cell it belongs to. A
circulation the tornado vortex signature algorithm has fired on is marked
separately and in red.
A radar signature is not a confirmed tornado and is not a warning. Follow
official NWS warnings.
3D view
Hydrometeor classification. A new 3D field labels every voxel by what the
radar is most likely looking at — rain, heavy rain, big drops, hail mixed with
rain, graupel, wet and dry snow, ice crystals, ground clutter or biological
scatterers — using a fuzzy-logic classifier over reflectivity, differential
reflectivity and correlation coefficient. The melting level is found from the
volume's own bright band rather than assumed, so the ice/liquid boundary
follows the day's atmosphere. A legend sits beside the render, and the
threshold slider switches between all classes and weather only.
It runs without KDP or the texture fields the operational NEXRAD algorithm
uses, so heavy rain and hail lean harder on Z and ZDR than they should, and
clutter with a high correlation coefficient can still be called weather. Good
for reading storm structure; not a substitute for the operational product.
Fixed: the 3D view invented readings at the edge of the data (#9). The
volume is a texture of palette indices, and the sampler filtered them, so
where data met empty space the index slid through the middle of the table.
Half way from 0 m/s to empty was a fully opaque −32 m/s that nothing measured
— which is what drew the cone standing on the radar site in velocity, ZDR and
CC. Reflectivity was never affected, because its low values are already
transparent. Value and coverage are now filtered separately.
What's Changed
- Write release notes in the repo instead of after the fact by @RiotTheClanker in #20
- Stop the 3D view inventing readings at the edge of the data by @RiotTheClanker in #23
- Classify hydrometeors in the 3D view by @RiotTheClanker in #24
- Storm tracks: overlay, on-device cells, and NOAA's Level 3 storm table by @RiotTheClanker in #27
- Take storm tracks from NOAA instead of computing them by @RiotTheClanker in #29
- Show NOAA's mesocyclone and tornado vortex detections by @RiotTheClanker in #30
- Close the azimuth slivers that drew as spokes through Level 2 by @RiotTheClanker in #31
Full Changelog: v0.1.3...v0.1.4
v0.1.3
What's Changed
- Docs: state the Android signing cost, and stop naming other radar apps by @RiotTheClanker in #17
- Name the app Taa'a Yuku Radar, give it an icon, and prepare Android signing by @RiotTheClanker in #18
- Move to applicationId io.github.riottheclanker.taayuku, and cut 0.1.3 by @RiotTheClanker in #19
Full Changelog: v0.1.2...v0.1.3
v0.1.2
What's Changed
- v0.1.2 — watches and advisories, upper-air soundings with on-device indices by @RiotTheClanker in #15
Full Changelog: v0.1.1...v0.1.2
v0.1.1
What's Changed
- Fix Android release networking, portrait toolbar overflow, and the 3D view by @RiotTheClanker in #3
- v0.1.1 — GPS location, color key, 3D terrain and cone of silence by @RiotTheClanker in #12
New Contributors
- @RiotTheClanker made their first contribution in #3
Full Changelog: v0.1.0...v0.1.1
v0.1.0 — first packaged build
First packaged build. Everything here decodes and computes on your device from free NOAA/NWS open data — no subscription, no account, no server.
What's in it
Radar — full NEXRAD Level 2 (every moment, every tilt, super-res) and Level 3 products, plus the MRMS national mosaic that takes over when you zoom out. The visible area re-renders at screen resolution, so gates stay sharp at any zoom.
Computed locally — composite reflectivity, VIL, echo tops, storm-relative velocity, rotation (azimuthal shear), and future radar: motion tracked between scans and extrapolated up to 60 minutes ahead.
3D — GPU-raymarched storm volumes you can fly through, with slice planes, a basemap on the ground, compass, radar pin, and reflectivity / wind / ZDR / CC as selectable fields.
Situational awareness — NWS warnings, SPC convective outlook and storm reports, lightning from Blitzortung and/or GOES GLM, an aiming cursor with range ring (value, range, heading, beam height), historical replay back to 1991, measuring, snapshots, and GRLevelX .pal color tables.
Install
Debian / Ubuntu
sudo apt install ./radar-app_0.1.0_amd64.deb
Windows and Android builds are produced by CI and will be attached here once that run finishes.
Caveats
- Only the Linux package has been verified on real hardware.
- Nothing is code-signed yet, so expect "unknown publisher" warnings on Windows and Android.
- Not affiliated with NOAA or the NWS. Never rely on this as your only source of warning information.
Full Changelog: https://github.com/RiotTheClanker/radar-app/commits/v0.1.0