Commit graph

217 commits

Author SHA1 Message Date
c42c5d8c4c
Enqueue weather (ASOS/RAOB) fetch on page view when missing 2026-04-02 11:02:05 -05:00
43f7bcf3c8
Recompute elevation profile with duct data when soundings arrive 2026-04-02 10:25:42 -05:00
bffe3616b5
Disable force_ssl — SSL terminated by Cloudflare tunnel 2026-04-02 10:20:43 -05:00
1404923e97
Remove local HRRR filesystem cache in dev, proxy only 2026-04-02 09:53:23 -05:00
bb35d325b3
Remove local HRRR cache dir in prod, proxy only 2026-04-02 09:53:01 -05:00
9f3d47e3b6
Configure prod HRRR caching and proxy via skippy 2026-04-02 09:52:31 -05:00
5fe005e0b2
Add *.psql to gitignore 2026-04-02 09:39:16 -05:00
17b66d6903
Live-update soundings and surface observations on contact page
- WeatherFetchWorker broadcasts on ASOS and RAOB completion
- Contact show page subscribes and reloads weather data on receipt
- Loading spinners for soundings and surface observations when queued
- Propagation analysis recomputed with new sounding duct data
2026-04-02 08:22:43 -05:00
a3ac8cff8d
Show loading spinners while enrichment jobs are processing 2026-04-02 08:19:52 -05:00
d207863b15
Live-update contact detail page when enrichment completes
- HRRR and terrain workers broadcast via PubSub on completion
- Contact show page subscribes and recomputes elevation profile,
  propagation analysis, and HRRR data on receipt
- Page updates in-place without reload when background jobs finish
2026-04-02 08:17:43 -05:00
0503fb3799
Re-enable HRRR auto-enqueue on contact detail page view 2026-04-02 08:08:28 -05:00
fd00de7bc6
Never download SRTM tiles during page load, only in Oban workers
- Srtm.lookup no longer auto-downloads by default, requires download: true
- TerrainProfileWorker passes download: true for background tile fetch
- Contact detail page enqueues TerrainProfileWorker if profile missing
- Page load gracefully handles missing tiles via API fallback or nil
2026-04-02 08:07:26 -05:00
ebd22ce156
Gracefully handle SRTM tile download failures on page load 2026-04-02 08:03:05 -05:00
737de10bf4
Support arbitrary-precision Maidenhead grid squares
Extend grid validation and decoding from 4/6 chars to unlimited
even-length grids (8, 10, etc). Recursive decoder handles alternating
letter(/24) and digit(/10) subdivision pairs after the field+square.
Validated against gridmap-web's Maidenhead implementation.
2026-04-02 07:31:52 -05:00
4af6c5db73
Fix stale pressure trend scores and pressure levels in algo.md 2026-04-01 18:28:10 -05:00
1a9be5eeb0
Increase HRRR download timeouts to 120s for proxy/backfill 2026-04-01 18:11:58 -05:00
7fa8ca1ebe
Remove reference to 'original model' in algo.md 2026-04-01 16:52:46 -05:00
dd8ac4a311
Rewrite meteorological foundations for technical audience 2026-04-01 16:21:21 -05:00
485dfe0f75
Use skippy.w5isp.com for HRRR proxy 2026-04-01 16:11:30 -05:00
5aeec4f55e
Make HRRR base URL configurable, default to skippy proxy in dev 2026-04-01 16:07:17 -05:00
20eb559bb0
Default contacts list sort to inserted_at desc 2026-04-01 16:00:21 -05:00
fd33eff8bc
Add required attribute to all single contact form fields 2026-04-01 15:56:25 -05:00
1b5cd19d6d
Skip already-backfilled HRRR points with sufficient level count 2026-04-01 15:52:35 -05:00
ff0ca89646
Add HRRR GRIB2 caching and backfill task for finer pressure levels
- Cache raw GRIB2 byte ranges to ~/hrrr in dev (never deleted)
- mix hrrr_backfill re-fetches QSO-linked HRRR profiles with 13 levels
- Supports --all (re-fetch everything) and --limit N flags
- Groups by HRRR hour to batch requests, 500ms rate limit
- AWS archive has full HRRR history, same URL pattern as live feed
2026-04-01 15:50:55 -05:00
bdaf74f5ef
Add intermediate HRRR pressure levels for duct detection
Fetch every 25mb from 1000-700mb (13 levels, up from 8). Gives ~80m
vertical spacing near the surface, enough to resolve ducting layers
that were previously invisible between the coarse 250m level spacing.
2026-04-01 15:46:22 -05:00
a25864bdcb
Sanitize and validate user-submitted contact fields
- Callsigns: strip whitespace, upcase, validate alphanumeric + /
- Grids: strip whitespace, upcase before Maidenhead validation
- Email: stricter regex, max 254 chars
- Callsign max length 20 chars
- Fix static_paths to include downloads directory
- Update show test for removed contact details section
2026-04-01 15:41:42 -05:00
ec388e4bf5
Use Timex for flexible CSV timestamp parsing with tests
- Add timex ~> 3.7, downgrade gettext to ~> 0.26 for compatibility
- Parse ISO 8601, US dates (M/D/YYYY), AM/PM, 24h, compact formats
- 22 tests covering all accepted timestamp formats and edge cases
- Integration tests for CSV import with US date and space-separated formats
2026-04-01 15:39:02 -05:00
05654289af
Accept various date/time formats in CSV import
Parse US dates (6/15/2024 2:30 PM), 24h (06/15/2024 14:30),
dashes (06-15-2024 14:30), compact (20240615 1430), date-only
(2024-06-15), and ISO 8601 — all normalized to UTC before insert.
2026-04-01 15:35:35 -05:00
bc70b38e93
Add info box about contact availability after submission 2026-04-01 15:32:44 -05:00
4e092a0cf5
Use bulleted list for CSV upload instructions 2026-04-01 15:31:38 -05:00
2b11b872d9
Restyle submit page tabs as segmented control 2026-04-01 15:31:09 -05:00
239bf707aa
Fix HRRR prune timeout: bound time range for partition pruning 2026-04-01 15:27:11 -05:00
bf90249a06
Format contact detail page via Styler 2026-04-01 15:06:02 -05:00
18a291555c
Add CSV bulk upload to /submit page
Adds a tabbed UI with single-contact form and CSV upload. Users can
download a sample CSV, upload their file, and get partial import with
per-row error reporting. Enrichment jobs enqueue for each imported contact.
2026-04-01 15:05:51 -05:00
86b6c0db31
Fix BadBooleanError when HRRR data is nil in propagation analysis 2026-04-01 14:06:49 -05:00
f02b111c1f
Disable auto HRRR backfill on contact detail page view 2026-04-01 13:57:23 -05:00
71091219f4
Add tidewave dev tool, taller elevation profile chart
- Install tidewave ~> 0.5 for dev MCP integration
- Increase elevation profile chart height from h-64 to h-96
2026-04-01 13:41:39 -05:00
dbc00989cd
Add propagation analysis with summary and factor breakdown
- Text summary explaining likely propagation mechanism (ducting,
  enhanced refraction, diffraction, troposcatter) based on terrain,
  HRRR, and sounding data
- 10-factor scoring table with per-factor notes, weights, contributions
- Composite score with tier badge
- Grid squares added back to path info line
- Analysis positioned between elevation chart and terrain profile
2026-04-01 13:38:10 -05:00
4aaa028ed1
Highlight likely propagation duct, improve contact detail layout
- Mark duct closest to endpoint elevations as likely signal path
- Likely duct drawn with solid borders, bold label, stronger fill
- Other ducts shown dimmed with dashed borders
- Fix path info layout: table columns prevent El wrapping
- Surface observations as compact table, limited to 5 nearest stations
2026-04-01 13:31:56 -05:00
5f8c689035
Improve duct detection and compact contact detail layout
- Use all HRRR profiles along path (start, mid, end) for duct detection
- Fall back to sounding ducts when HRRR too coarse to detect layers
- Merge overlapping ducts, show top 3 strongest with source labels
- Limit surface observations to 5 closest stations along path
- Compact solar conditions as inline row
- Compact band/mode/distance info line
- Fix button text to "Flag as Invalid"
2026-04-01 13:28:42 -05:00
7ba82f4601
Duct visualization, flag invalid contacts, fix HRRR pruning
- Overlay HRRR duct layers on elevation profile chart (green bands)
- Add flagged_invalid field to contacts with toggle button on detail page
- Fix prune_old_grid_profiles to only delete 0.125° grid profiles,
  preserving QSO-linked HRRR data at arbitrary positions
- Auto-enqueue HRRR fetch when viewing contact without HRRR data (<48h)
- Compact solar conditions and contact details layout
- Add band/mode/distance info line to elevation profile section
2026-04-01 13:09:09 -05:00
f7a753626d
Add interactive popups to contact map, dedup reciprocals, darken line colors 2026-04-01 12:39:02 -05:00
cd8d7a0f52
Add contact detail map, elevation profile chart, and UI improvements
- Leaflet map on contact detail pages showing both station locations
- SRTM elevation profile with Chart.js: terrain, LOS, Fresnel zone
- Path info: distance, azimuth, elevation angle in both directions
- Compact 4-column grid layout for contact details
- Contact map page with all contacts plotted
- Rename QSOs to Contacts in page header
- Wrap algo page in standard layout
2026-04-01 12:34:03 -05:00
ea96c93e2d
Rename QSO to Contact in UI, add higher bands, improve submit page
- All menus and UI text now say Contacts instead of QSOs
- Add 68, 122, 134, 241 GHz bands to submit form and validation
- Add info box on submit page explaining why contacts matter
- Larger submit button with icon
- Make HRRR partition migration idempotent for partial re-runs
2026-04-01 12:28:24 -05:00
2c16fd979d
Move ML deps to dev/test only, exclude from production build
- Nx, Axon, EXLA, Polaris deps restricted to only: [:dev, :test]
- model.ex and training mix tasks moved to lib_ml/ (compiled via
  elixirc_paths in dev/test only)
- load_ml_model uses Code.ensure_loaded? + apply/3 to avoid
  compile-time references to ML modules in production
- Verified: MIX_ENV=prod compiles clean with no ML warnings
2026-04-01 12:10:31 -05:00
254e64dedc
Rename qsos to contacts throughout codebase, keep DB table name
Rename all modules, functions, variables, routes, and UI text from
qso/qsos to contact/contacts. Database table stays as "qsos" to avoid
migration. Add /qsos -> /contacts redirects for old URLs.
2026-04-01 11:25:04 -05:00
bc529af392
Update algo.md Finding 10: corrected mode advantage, no SSB on rainscatter 2026-04-01 11:10:11 -05:00
fea9523943
Correct Finding 10: Great Lakes firing squad explains 24G PH anomaly
SSB is not possible on rainscatter - the original analysis was wrong.
The 24 GHz PH advantage is entirely a contest strategy artifact: Great
Lakes operators line up on opposite shores for rapid-fire SSB contacts.
With EN/CM/DM cluster activity removed, CW leads by 16% at 24 GHz.
CW advantage is monotonically increasing with frequency as physics
predicts. No 24 GHz anomaly exists.
2026-04-01 11:07:58 -05:00
b75516ff9f
Partition hrrr_profiles by valid_time for query performance
54M row table partitioned into date-range partitions. Queries with
valid_time filter only scan relevant partitions. Prune now uses
partition-aware DELETE. Fix tests for partitioned constraint behavior
and removed sort-click tests (grouped table uses URL params).
2026-04-01 11:03:33 -05:00
072c418cb3
Fix HRRR prune timeout: batch delete with 60s timeout instead of full table scan 2026-04-01 10:45:09 -05:00