Spaces:
Running
Running
Commit History
-
Live bundle: encode radar textures as lossless WebP (method=4) instead of PNG — ~25% smaller bundles, lossless (gray values unchanged). Client loads textures as image/webp; logo + downloaded export stills stay PNG. Running
swnesbitte049811
-
Live: every site uses the low-latency chunk feed (in-progress volumes shown), archive-bucket fallback. Short-lived caches now that all sites cache: drop a site's decoded volumes ~10 min after last view (touch-on-read LRU, _CHUNK_TTL=600s); chunk files pruned at ~80 min (covers the 65-min loop); live cache ttl 45s + rtsec 120s for all sites.
swnesbitt89d1903 -
UI + export: rename 'Load hour' button to 'Go', hide the 'Download raw' button; export zoom now matches the on-screen view — contain the visible extent at the same scale (anchor width/height by aspect) across single / quad / Z+V exports.
swnesbitt94f87c2 -
Lowest-sweep-only: render just the lowest elevation cut(s) (LOW_SWEEP_TOL=0.15) so a site's 0.3 deg supplemental cut hides its 0.5 deg cut (e.g. KBUF). Applied to the xradar render path (_tree_to_frames) and the dealias path (_dealias_dtree). Server-side sweep selection.
swnesbitte1f7b3f -
Re-apply Py-ART elimination on stable base: xradar fork = sole ingest, dealias via region_dealias.sweep_folds on xradar arrays (Nyquist from ds['nyquist_velocity'], max|V| fallback), bundled nexrad_sites.py coords (replaces pyart NEXRAD_LOCATIONS), removed _process_pyart fallback, dropped arm-pyart. Server-side only — no live-default/UI changes (built on a4cbd62).
swnesbitte4c1ca9 -
Cosmetic update on stable base: title -> 'NEXRAD Level 2 low level sweep browser', remove Py-ART processing credit (+ add (S. Nesbitt) to region-dealias), one consistent dvh map height + tighter mobile layout. Text/CSS only — no ingest/functional changes.
swnesbitta4cbd62
-
Remove debug instrumentation from app.py (revert thread-pool gate + breadcrumbs from abandoned Mac-app debugging)
Steve Nesbitt8ed9e1a -
macOS bundle: eliminate fork() — thread decode pool (NEXRAD_INPROC_POOL) + open browser via os.posix_spawn (Obj-C process aborts on fork)
Steve Nesbitt04bcd84 -
Briefcase launcher: open browser via macOS /usr/bin/open (robust) + keep-alive marker
Steve Nesbittf0ea927 -
Briefcase: open app in default browser instead of pywebview (pyobjc segfaults in the thinned bundle); force fork for the decode pool; drop pywebview/pyobjc/proxy_tools
Steve Nesbitt41ea86b -
Briefcase: fix pywebview backtracking to 3.4 — ship proxy_tools wheel + --find-links, pin pywebview>=5, drop std-nslog (<private> log redaction)
Steve Nesbitt6f90024 -
Briefcase launcher: fix macOS-spawn worker imports (HERE on sys.path at import) + verbose startup logging + browser fallback if pywebview fails
Steve Nesbitt9c18368 -
Pin gradio==5.34.2 to match HF Space sdk_version (Space + Mac identical; avoids pip drift past sdk_version)
Steve Nesbitt203cde6 -
Pin gradio>=5,<6: app UI targets Gradio 5 (Gradio 6 dropped launch(show_api=...))
Steve Nesbittbad5783 -
Student guide: state macOS Sonoma (14) or later as the requirement
Steve Nesbitt3d9a357 -
Briefcase: min_os_version=14.0 for numpy-2-coherent stack (netCDF4 1.7.x arm64 wheel is macosx_14); add std-nslog; student install guide
Steve Nesbitt5ec32f5 -
Briefcase: min_os_version=12.0 (scipy/netCDF4 wheels need macOS 12+); document adhoc-sign distribution caveat
Steve Nesbitt1fc841b -
Briefcase: hyphenate app name (nexrad-l2) so module maps to src/nexrad_l2 package
Steve Nesbittf4b5a91 -
Briefcase: PEP 639 SPDX license string (fixes 'briefcase create' license error)
Steve Nesbitta223fa4 -
Desktop: add Briefcase (BeeWare) build as an alternative to py2app
Steve NesbittReuses single-source app.py via sync_sources.sh (copies app.py->radar.py, sites.py, logo.png, cities.json into the package). Apple-Silicon, adhoc-sign, no Developer ID. README documents the flow.778b649 -
Desktop: free unsigned .app/.dmg build (Apple Silicon) — build_app.sh, icon, FIRST_OPEN instructions
s8d7589b -
Desktop: inherit deps from root requirements (single source); launcher interface check + sync docs
sca7b41e -
Guard background daemons under start_background() for macOS spawn-safety; add desktop launcher (pywebview)
s0c33a0a -
Site picker: switch radar in place with progress bar (no full reload)
s634670a
-
Site picker: use curated WSR-88D list (sites.py), not all NEXRAD_LOCATIONS (drops TDWR)
s7a00b12 -
Add in-map radar-site picker overlay + block-I favicon
sRadar-icon button toggles green clickable boxes (Arial bold 4-letter IDs) at every WSR-88D site (from pyart NEXRAD_LOCATIONS, served as sites.json) on the current view; clicking a site navigates to it keeping the current field/layout and mode (live->latest live; archive->same hour). Favicon set to the orange block-I on Illini blue via an SVG data URI in the head.80aa752 -
Live: server-side poller keeps recently-viewed sites' chunks fresh
sIngest was client-driven (gr.Timer in the browser), so a backgrounded tab froze the timer and the live file went stale (other apps showed newer scans). Add _live_poller daemon (like _warn_poller): browse() realtime registers the site in _LIVE_ACTIVE; the daemon re-decodes those sites every 60s for 20 min after last view via _realtime_compute, so live_<site>.json stays current regardless of any client.222aea5 -
Live: check the chunk feed for new scans every minute (Timer 120->60s)
Steve Nesbitt705076f
-
Hide redundant top Field dropdown (use the in-map field selector)
Steve Nesbittc2aeb12 -
Nudge map height offset 160->170 to fit footer (measured ideal ~169)
Steve Nesbittf798390 -
Full-bleed layout: override Gradio's 1280px centered main; 2px edges
Steve NesbittThe <main class='fillable app'> wrapper was centered at max-width 1280px with 41px margins + 32px padding (the side whitespace). Override to full width with 2px padding, zero map block padding (edge-to-edge radar), and re-tune the map height offset (188->160) for the now-tighter chrome.22efc29 -
Tighten layout: ~2px edges, collapse inter-element gaps, fill map
Steve Nesbitt9a30084 -
Use more of the window: compact header + fix map height offsets
Steve NesbittThe huggingface.co embed sized the map at innerHeight-305 while the real chrome is ~210, leaving ~70-100px of dead space below the map. Reduce the embed pin (305->210) and direct offset (205->210), and compact the header (smaller logo, tighter fonts/padding) so the map fills the viewport.a480e28 -
Header: credit CliMAS / Univ. of Illinois (climas.illinois.edu)
Steve NesbittReplace the AWS-archive subtitle with 'Brought to you by the Department of Climate, Meteorology & Atmospheric Sciences, University of Illinois Urbana-Champaign' linking to climas.illinois.edu.542453c -
Show the radar site ID in the page (tab) title
Steve NesbittEach loaded bundle sets the parent app page's document.title to '<SITE> · NEXRAD Level 2 — 0.5° browser', so the browser tab reflects the current site.fc9049a -
Dealias: keep the current frame instead of resetting
Steve NesbittToggling dealias rebuilds the iframe to add the dealiased textures; the new bundle restarted at frame 0 (archive), so the view jumped off the current frame. Hand the current frame index to the rebuilt bundle via the shared parent (__restoreIdx) and restore it on init.32d9481 -
Live autoupdate: never grey the display
Steve NesbittThe gr.Timer (and the force-refresh handler) listed map_html as an output, so Gradio marked the map 'generating' and dimmed it on each autoupdate even though it returned skip. Give both no outputs — they only refresh the live frame file, and the in-page poller swaps frames in place when ready (no grey, no reload).d344c71 -
Warnings: add flash flood warnings (FF) as green polygons
Steve NesbittInclude PHENOM=FF storm-based polygon warnings in the IEM filter; render flash-flood outlines green (TO red / SV yellow / FF green) via a shared warnColor() used by both the live Leaflet overlay and the export compositor. Same black buffer + expiry handling as TO/SV.a176509 -
Log active dealias engine at startup (greppable in Space logs)
Steve Nesbittd1ead26 -
Progress bar: label the active dealiaser (Rust region-dealias vs Py-ART)
Steve Nesbitt55d25df -
Footer: credit the Rust region-dealias dealiaser
Steve Nesbitt85c6aa2 -
Enable region-dealias (Rust dealiaser) now that it's on PyPI
Steve Nesbitt3ffc110 -
Use region-dealias (Rust) for dealiasing, with pyart fallback
Steve NesbittImport region_dealias if installed and route both dealias call sites through a helper that falls back to pyart.correct.dealias_region_based (on absence or NotImplementedError). No-op until the wheel is installed; requirements has a commented placeholder to enable once it's on PyPI.79cd897 -
Export: add units to the quad/Z+V mini colorbars
Steve NesbittThe mini colorbars in the 2x2 and Z+V exports showed only min/max numbers. Expose units in the colorbar cfg and label each mini colorbar with its units (centered above the bar). Single-panel export already shows the full labelled colorbar.346f261 -
Fix shared Z+V link: add ZVF to field dropdown choices
Steve NesbittSharing the 2x1 view set field_dd to 'Z+V (2-panel)', which wasn't in the dropdown's choices, so Gradio raised a validation error on load. Add ZVF (like QUAD) to the choices.f1d7c31 -
Share link: always build an absolute URL
Steve NesbittSHARE_BASE is a bare query string when the server doesn't know the Space host (always so in live mode), so the copied link was relative. Prepend the app's origin+pathname client-side (via same-origin parent.location) so the share button yields a full, openable URL.8c44981 -
Force-refresh: stop spinner as soon as server reports done
Steve NesbittLive tag/json now carry a 'ts' that bumps on every compute (even when the etag is unchanged). The refresh button records baseTs, triggers the server, then stops the spinner the moment new scans merge (etag change) OR the server finishes with no change (ts advances) -- no more full-window spin.fb4010f -
Live: add forced-refresh button (snappy, in-place)
Steve NesbittIn-map refresh button (live only): instantly re-polls warnings, asks the server to drop the RT cache and re-decode the live hour now (picks up new scans), then fast-polls the frame file (~0.6s) until the new data lands -- all merged in place, no iframe reload. Spinning icon while busy. Server force_refresh handler returns gr.skip() (no map_html swap).d1bd562 -
Loop: dwell on last frame 4x the frame interval
Steve NesbittPlayback (and loop-movie exports) now hold the final frame 4x the normal 450ms step before looping back, so the end of the loop reads clearly. FRAME_MS/END_DWELL drive both the on-screen play loop and the quad/zv/ single export recorders.3d2038e -
Warning polygons: 0.25pt black buffer (casing)
Steve NesbittDraw a thin black casing under the TOR/SVR warning outlines for contrast against bright radar -- live (two Leaflet layers: black casing + colored line on top) and exports (black stroke pass + colored pass). Buffer is 0.25pt, scaled to export resolution.94a4441