Commit graph

665 commits

Author SHA1 Message Date
2aa76727f9 Add callsign filter and band counts to contacts map
- Callsign input filters contacts where either station matches
  (case-insensitive substring match, debounced 300ms)
- Band checkboxes now show per-band count of visible contacts
- All/None buttons for quick band selection
- Header count updates dynamically with filters
- Complete rewrite: rebuilds map on any filter change instead of
  toggling individual layers (simpler, handles cross-filter correctly)
2026-04-11 15:26:57 -05:00
FluxCD
6d30714521 chore: update prop image to git.mcintire.me/graham/prop:main-1775939032-1820bc0 [skip ci] 2026-04-11 20:25:38 +00:00
5a1ac63f56 Force dark theme on map sidebar and mobile controls
The sidebar and mobile floating controls overlay the dark map tiles
but inherited light theme colors, making dropdowns, inputs, and
menus invisible (white-on-white). Adding data-theme="dark" forces
all daisyUI components within these containers to use dark variants
regardless of the page's theme setting.
2026-04-11 15:23:26 -05:00
FluxCD
0b1e411110 chore: update prop image to git.mcintire.me/graham/prop:main-1775938787-827019c [skip ci] 2026-04-11 20:20:38 +00:00
e8ae407be9 Add rain scatter prediction to map detail panel
When clicking a grid point, fetches the latest NEXRAD composite
reflectivity and identifies rain cells within 300 km that could
enable rain scatter contacts. Shows:
- Scatter classification (excellent/good/marginal/none)
- Top 3 cells with dBZ, distance, bearing, and relative signal
- Colored circle markers on the map at rain cell locations
- Markers sized by reflectivity, colored by intensity

Uses simplified bistatic radar equation accounting for reflectivity,
frequency-dependent scattering (Rayleigh/Mie), and R^4 path loss.
NEXRAD cells sampled every ~5 km within bounding box for efficiency.
2026-04-11 15:19:19 -05:00
FluxCD
2e9d6a7c7f chore: update prop image to git.mcintire.me/graham/prop:main-1775937341-75cf493 [skip ci] 2026-04-11 19:56:29 +00:00
9fea93f59c Show earth curvature in contact elevation profile
Terrain elevations now include the earth bulge correction, so the
profile visually humps up in the middle relative to the straight
LOS beam — showing how the curved earth rises into the signal path.
Uses actual k-factor from HRRR refractivity when available, otherwise
standard 4/3. For a 300 km path at k=4/3, the midpoint bulge is
~2,650 m (8,700 ft).
2026-04-11 14:55:21 -05:00
ab8773acd0 Add per-band filter checkboxes with All/None to contacts map 2026-04-11 14:55:21 -05:00
ff1b2d0cbe Add Maidenhead grid overlay toggle to contact map 2026-04-11 14:55:21 -05:00
13782ea7d4 Increase max zoom on main map from 10 to 13 2026-04-11 14:55:21 -05:00
8a39ae4411 Improve light mode contrast for score colors and map controls
- Darken tier colors for page elements (path, beacon, contact pages):
  EXCELLENT #00ffa3→#059669, GOOD #7dffd4→#0d9488,
  MARGINAL #ffe566→#ca8a04, POOR #ff9044→#ea580c,
  NEGLIGIBLE #ff4f4f→#dc2626
- Make mobile map controls fully opaque (bg-base-100 not /90)
- Map popups (dark background) keep original vibrant colors
2026-04-11 14:55:21 -05:00
FluxCD
a0c59bd759 chore: update prop image to git.mcintire.me/graham/prop:main-1775934822-6f9477c [skip ci] 2026-04-11 19:14:20 +00:00
bcdbf0b53a Show per-duct layer heights in map detail panel
When clicking a grid point with ducting, the panel now shows each
duct layer with base-top height in feet, thickness in meters, and
minimum trapped frequency. Data flows from Duct.analyze through
the scoring factors as a ducts array.
2026-04-11 14:13:24 -05:00
FluxCD
da0d0fcbdb chore: update prop image to git.mcintire.me/graham/prop:main-1775934001-2db220b [skip ci] 2026-04-11 19:01:18 +00:00
03bd77c6d4 Update CLAUDE.md scoring table: 10 factors with recalibrated weights 2026-04-11 13:59:42 -05:00
FluxCD
bda8928309 chore: update prop image to git.mcintire.me/graham/prop:main-1775933573-516a430 [skip ci] 2026-04-11 18:54:15 +00:00
bac0bc3a98 Update about page: ten factors, mention PWAT and native duct detection 2026-04-11 13:52:26 -05:00
FluxCD
0448ff47cc chore: update prop image to git.mcintire.me/graham/prop:main-1775933390-856c5ff [skip ci] 2026-04-11 18:51:14 +00:00
58a99de3cd Fix map detail panel: update weights, add PWAT, show duct info
- Update all 9 hardcoded weights to match recalibrated values
- Add missing PWAT factor (11.3% weight) to FACTOR_META and FACTOR_ORDER
- Reorder factors by weight (highest first)
- Fix pressure explanation (low pressure is better, not rising)
- Add PWAT factor explanation (beneficial vs harmful by band)
- Show duct info panel when native data detects ducting layers
  (count, thickness, minimum trapped frequency)
2026-04-11 13:49:24 -05:00
FluxCD
a1d787b26f chore: update prop image to git.mcintire.me/graham/prop:main-1775933080-2e4602e [skip ci] 2026-04-11 18:46:13 +00:00
880988b591 Update algo.md weights and data flow for native duct integration
- Replace stale April 2026 manual weights with recalibrated values
- Document native hybrid-sigma data in data flow section
- Note refractivity factor now uses native 10-50m resolution
- Add hourly grid integration section to Part 12
- Expose duct_info (count, freq, thickness) in scoring factors for UI
2026-04-11 13:44:13 -05:00
FluxCD
fe7597fb26 chore: update prop image to git.mcintire.me/graham/prop:main-1775932266-bd4a15e [skip ci] 2026-04-11 18:32:10 +00:00
57578dff4d Add native HRRR duct detection to hourly propagation scoring
The PropagationGridWorker now fetches native hybrid-sigma levels
(TMP, SPFH, HGT, PRES × 50 levels) alongside the standard surface
and pressure products. Native data provides 10-50m vertical spacing
vs 250m from pressure levels, detecting thin surface ducts invisible
to the standard product.

Key design: cell-by-cell reducer in Wgrib2.extract_grid_from_file_mapped
processes each of the 95k CONUS cells through a duct analysis function
inline, keeping only scalar metrics per cell. Peak memory ~86 MB
instead of ~1.8 GB for the full grid map.

Per-cell output: native_min_gradient, best_duct_freq_ghz,
max_duct_thickness_m, duct_count. The scorer prefers the native
gradient over the pressure-level gradient when available.

Native fetch is optional — if it fails, scoring continues with
pressure-level data only.
2026-04-11 13:30:48 -05:00
FluxCD
5a5b1481c9 chore: update prop image to git.mcintire.me/graham/prop:main-1775931628-0389269 [skip ci] 2026-04-11 18:22:07 +00:00
7d68d13dcc Recalibrate scoring weights from gradient descent on 5000 QSOs
Loss improved 72% (0.42 → 0.12). Key changes:
- rain: 0.08 → 0.136 (+70%) — strongest discriminator
- season: 0.08 → 0.111 (+39%)
- wind: 0.05 → 0.08 (+60%)
- refractivity: 0.08 → 0.105 (+31%)
- time_of_day: 0.10 → 0.050 (-50%) — was overweighted by contest bias
- pressure: 0.15 → 0.103 (-31%)
- humidity: 0.18 → 0.124 (-31%)

Validated by native profile backtest (11,431 profiles):
theta_e_jump strongest native discriminator, duct_usable_* and
bulk_richardson dropped as dead features.
2026-04-11 13:20:00 -05:00
FluxCD
664ffc9ef1 chore: update prop image to git.mcintire.me/graham/prop:main-1775931128-5724d7f [skip ci] 2026-04-11 18:15:05 +00:00
d49ec5d32e Drop dead backtest features, document consolidated results
Backtest on 11,431 native profiles (2026-04-11):
- Drop duct_usable_10/24/47ghz (always 1.0, no discrimination)
- Drop bulk_richardson (near-identical QSO vs baseline means)
- Document all feature results with signal strength assessment
- theta_e_jump is strongest native discriminator (44% lift)
- best_duct_freq and duct_thickness show clear physical signal
2026-04-11 13:11:39 -05:00
FluxCD
3077e102fc chore: update prop image to git.mcintire.me/graham/prop:main-1775930206-e873ffc [skip ci] 2026-04-11 17:57:03 +00:00
cebf6f3f69 Speed up rolling deploys: allow surge, reduce startup delay
- maxSurge 0→1: new pods start before old ones terminate
- minReadySeconds 10→5
- startupProbe: initialDelay 10→5s, period 5→3s
2026-04-11 12:56:26 -05:00
FluxCD
b7e0c3bc7a chore: update prop image to git.mcintire.me/graham/prop:main-1775929975-e6e1395 [skip ci] 2026-04-11 17:54:01 +00:00
72051fe5ee Guard against zero specific humidity in theta-e computation 2026-04-11 12:52:32 -05:00
FluxCD
9d5ebc650b chore: update prop image to git.mcintire.me/graham/prop:main-1775927046-d0d6d9a [skip ci] 2026-04-11 17:05:20 +00:00
b1226c6ba1 Update deps: credo, lazy_html, live_stash, fine 2026-04-11 12:03:43 -05:00
f8c78b7282 update deps 2026-04-11 12:03:43 -05:00
FluxCD
0a543e3fb8 chore: update prop image to git.mcintire.me/graham/prop:main-1775920772-8beba7b [skip ci] 2026-04-11 15:20:29 +00:00
c8127fbb02 Update algo.md to match current codebase
- Fix pressure scoring thresholds (finer granularity at <980-990 mb)
- Fix 10 GHz parameters (o2_db_km, h2o_coeff, seasonal Feb/Oct)
- Fix 24 GHz parameters (o2_db_km 0.02, h2o_coeff 0.002)
- Fix 47 GHz o2_db_km (0.04)
- Add 5 new UHF/microwave bands (902-5760 MHz)
- Add Part 12: HRRR native hybrid-sigma levels (50-level profiles)
- Add Part 13: Duct analysis (M-profile, trapped frequency)
- Add Part 14: Inversion analysis (Ri, theta-e, shear)
- Add Part 15: NEXRAD radar data integration
- Add Part 16: Backtest framework (21 features)
2026-04-11 10:19:08 -05:00
FluxCD
f4546ad1f3 chore: update prop image to git.mcintire.me/graham/prop:main-1775918982-3bb0660 [skip ci] 2026-04-11 14:50:55 +00:00
b5162daf89 Round lat/lon to 6 decimals everywhere, add commas to EIRP display
- Round grid-derived lat/lon in maybe_fill_latlon changeset step
- Format lat/lon to 6 decimal places on index table
- Migrate existing beacon data to 6 decimal precision
- Add comma separators to EIRP mW display (e.g. 10,000 mW)
- Extract shared add_commas helper for format_freq and format_mw
2026-04-11 09:49:12 -05:00
FluxCD
1a46020f6a chore: update prop image to git.mcintire.me/graham/prop:main-1775918703-838377d [skip ci] 2026-04-11 14:45:52 +00:00
2c1c221398 Change beacon height_ft from float to integer
Height in feet doesn't need decimal precision. Migrates the DB
column, updates schema type, and strips trailing .0 from form
input so the integer cast succeeds.
2026-04-11 09:44:42 -05:00
FluxCD
9b5880f01b chore: update prop image to git.mcintire.me/graham/prop:main-1775918528-1e0aaad [skip ci] 2026-04-11 14:42:51 +00:00
0059317043 Beacon page improvements: comma formatting, sorting, rounding
- Add CommaNumber JS hook for live comma formatting while typing
  frequency MHz in the beacon form
- Strip commas server-side before changeset validation
- Order beacon list by most recently added (desc inserted_at)
- Round lat/lon to 6 decimal places in changeset and display
- Round height_ft to integer in changeset and display
- Display coords at 6 decimal places on show page
2026-04-11 09:41:51 -05:00
FluxCD
9451b7f451 chore: update prop image to git.mcintire.me/graham/prop:main-1775918264-f6643e5 [skip ci] 2026-04-11 14:38:47 +00:00
8425edbdc4 Add comma separators to MHz frequencies on beacon pages
Formats frequencies like 10368.1 as "10,368.1" on both the
beacon list table and detail page (subtitle, map label, stat field).
2026-04-11 09:37:26 -05:00
FluxCD
6608e6105a chore: update prop image to git.mcintire.me/graham/prop:main-1775916293-ef44ae9 [skip ci] 2026-04-11 14:09:35 +00:00
ab819852ae Install Docker CLI in CI runner container 2026-04-11 09:04:22 -05:00
11c5d5fb43 Add -s flag to wgrib2 -lon extraction for inventory output
Without -s, wgrib2 -lon only outputs msg:offset:lon=X,lat=Y,val=Z
with no variable name or level. The -s flag adds the short inventory
(d=DATE:VAR:LEVEL:...) so the parser can identify which variable
each value belongs to.
2026-04-11 09:03:09 -05:00
FluxCD
0a970594a3 chore: update prop image to git.mcintire.me/graham/prop:main-1775916097-bb90bc8 [skip ci] 2026-04-11 14:02:34 +00:00
ac36441102 Remove grid squares toggle from rover planner page
The rover page now shows only: station markers, band selector,
propagation heatmap, and URL sharing. Grid overlay remains on
the main /map page.
2026-04-10 17:31:23 -05:00
FluxCD
1d76497db5 chore: update prop image to git.mcintire.me/graham/prop:main-1775859782-ceffcbc [skip ci] 2026-04-10 22:25:43 +00:00