Fix Meteor LRPT, global timezone, VDL2 correlation, and weather sat UX#202
Fix Meteor LRPT, global timezone, VDL2 correlation, and weather sat UX#202mitchross wants to merge 8 commits intosmittix:mainfrom
Conversation
Docker fixes: - Add missing COPY for /usr/local/share/ (pipeline definitions were never reaching the runtime image — root cause of silent SatDump failures) - Add libfftw3-double3 and libfftw3-single3 runtime dependencies - Handle arm64 vs x86 install path differences (/usr vs /usr/local) - Split SatDump compile and staging into separate layers for better caching - Add build-time assertions to catch missing pipelines early UI enhancements: - Timezone selector (UTC, Local, Eastern, Central, Mountain, Pacific) with localStorage persistence — all time displays update instantly - Pass analysis bar showing 24h quality breakdown and best upcoming pass - Enhanced pass cards with cardinal direction (NW→SE), BEST badge - Console timestamps, log level filters (ALL/SIGNAL/PROG/ERR), COPY/CLR - Pass count in stats strip - Demo data mode for UI testing without SDR or live satellite pass - Meteor M2-4 80k baud fallback pipeline option Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…edictions Pass prediction improvements: - Widen prediction window to 48h at 5° min elevation (was 24h/15°) - Add AOS/TCA/LOS pass geometry detail panel with times and bearings - Fix duration display (was showing seconds labeled as minutes) - Enhanced pass cards with AOS/LOS times, bearings, and directions - Add REFRESH button in passes panel header - Better empty state with clear "set your location" prompt and icon Countdown and visual: - Pulse animation on countdown when pass is imminent or active - Countdown numbers scale up and change color for urgency Sidebar getting started guide: - New "Getting Started" section explaining what Meteor satellites are, polar orbits, 4-8 passes/day, step-by-step workflow - "When to look" tips (elevation, day vs night, pass direction) - "What you need" equipment table with costs - Collapsed antenna guide by default to reduce initial overwhelm - Improved offline decode section with clear instructions on where to get IQ recordings Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Global time preferences (Settings > Display > Time & Timezone): - InterceptTime utility in core/utils.js with timezone + 12h/24h support - Timezone options: UTC, Local, Eastern, Central, Mountain, Pacific - Time format: 12-hour (AM/PM) or 24-hour toggle - Defaults to US/Eastern + 12-hour - Header nav clock updates to use selected timezone and format - Weather satellite mode delegates to global InterceptTime - Settings persist via localStorage, change listeners notify all modes Weather satellite improvements: - Satellite dropdown defaults to "All Meteor Satellites" showing all passes - Can still filter to specific satellite (M2-3, M2-4, M2-4-80K) - Capture button on pass cards auto-selects the correct satellite Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use global InterceptTime for all ACARS timestamps (respects Eastern/12h) - Add weather message rendering (wind, temperature, turbulence) - Add CPDLC controller-pilot message rendering (purple highlight) - Add squawk code change rendering (red highlight) - Fix engine_data crash when parsed value isn't an object - Show tail/registration alongside flight number on all cards - Increase message text truncation to 200 chars - Add FL prefix to flight level in position reports - Applied consistently across ADS-B dashboard, sidebar feed, and standalone ACARS mode Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause: dumpvdl2 outputs nested JSON (vdl2.avlc.acars.flight) but FlightCorrelator only checks top-level fields. VDL2 messages were stored in the correlator but never matched to any aircraft. Fix: Promote identifying fields (flight, reg, tail, icao, addr, label, text) from the nested VDL2 structure to top-level before storing in the correlator. Also promote AVLC source address as ICAO when src.type is "Aircraft". Also fix VDL2 sidebar timestamps to use global InterceptTime setting. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Timezone fixes: - Add utils.js (InterceptTime) to adsb_dashboard.html — was completely missing, causing all times to fall back to UTC regardless of setting - Register onChange listener in nav.html so clock updates instantly when timezone/format is changed in Settings - Initialize timezone/format dropdowns on ADS-B dashboard page load - Browser-verified: ET/12h ↔ UTC/24h switches instantly on ADS-B page VDL2 correlation fix: - Force ICAO hex to uppercase when promoting from VDL2 src.addr (dumpvdl2 may output lowercase, ADS-B stores uppercase — case mismatch prevented correlator from matching) - Move ICAO/addr promotion before ACARS field extraction so even non-ACARS VDL2 frames (XID, connection mgmt) get correlated Auth: - Add INTERCEPT_DISABLE_AUTH env var to skip login for local/dev use - Configurable via docker-compose.yml environment Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
app.js and nav.html both started 1-second intervals updating the same #headerUtcTime element. Even though both used InterceptTime, their slightly different timing caused visible text flicker. Fix: app.js now sets window._navClockStarted before starting its interval, so nav.html's guard condition skips its duplicate. Also register InterceptTime.onChange listener in app.js for instant updates. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…g UTC The updateHeaderClock function in index.html was inlined and still using raw UTC (toISOString), while nav.html's version used InterceptTime. Both ran on 1-second intervals updating the same element, causing the clock to rapidly alternate between ET and UTC. Fix: Updated the inline version in index.html to use InterceptTime, matching nav.html. Added _navClockStarted guard and onChange listener so only one interval runs and timezone changes apply instantly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
smittix
left a comment
There was a problem hiding this comment.
Thanks for the PR — there's a lot of good work here. The Dockerfile split into compile/staging layers is a genuine fix for the missing pipeline issue, and the InterceptTime module is well-structured. Before we can merge, there are two issues that need addressing:
Required fixes
1. updateTimelineLabels() — ReferenceError at runtime
In static/js/modes/weather-satellite.js, the new updateTimelineLabels() function references selectedTimezone and TZ_MAP directly, but those variables no longer exist after the InterceptTime refactor. This will throw a ReferenceError whenever a timezone is selected or passes are loaded.
Fix: replace the raw variable references with the InterceptTime API already used correctly elsewhere in this PR:
const tz = typeof InterceptTime !== 'undefined' ? InterceptTime.getTimezone() : 'UTC';
const ianaName = typeof InterceptTime !== 'undefined' ? InterceptTime.getIANA() : undefined;2. docker-compose.yml — profiles: [basic] on the intercept service breaks existing deployments
Adding profiles: [basic] to the intercept service means plain docker compose up -d starts nothing. Anyone using the documented docker compose --profile basic up -d workflow will be fine, but users who run the bare docker compose up -d will get a silently empty deployment.
The intercept service should remain unconditional (no profiles: block), consistent with how the service worked before this PR.
Other notes (not blocking)
- Clock flicker fix —
app.jsdoesn't check_navClockStartedbefore starting its own interval, so the duplicate-timer scenario may still partially occur on the main SPA page. INTERCEPT_DISABLE_AUTH— works correctly, but a startupapp.logger.warning()when the flag is active would help prevent accidental use in a deployed environment.INTERCEPT_IMAGEremoval — silently breaks users pulling a pre-built registry image (e.g. viabuild-multiarch.sh). Worth documenting if intentional.- Min elevation — 5° is at the horizon with maximum atmospheric attenuation; most users won't get a usable decode at that angle. 10° would be a better default.
- "24h passes" label — the analysis bar header still says "24h passes" but the fetch window is now 48h.
- VDL2 —
data['addr']is set redundantly alongsidedata['icao']; can be removed if not consumed downstream. - Default timezone — defaulting to US/Eastern will surprise non-US users; UTC would be a more neutral default.
Fix the two required items and this is ready to go.
Summary
Changes
Docker (Dockerfile)
libfftw3-double3andlibfftw3-single3runtime dependencies for SatDumpCOPY --from=builder /staging/usr/local/share/(pipeline definitions were never reaching runtime)/usrvs/usr/local)Weather Satellite UI
Global Time Preferences
InterceptTimeutility incore/utils.js(timezone + 12h/24h format)ADS-B / ACARS / VDL2
INTERCEPT_DISABLE_AUTHenv var for local/dev useClock Fix
setIntervaltimersupdateHeaderClockin index.html was still using raw UTCTest plan
docker exec intercept satdump --helpruns without missing library errorsls /usr/local/share/satdump/pipelines/shows 71 pipeline JSON files🤖 Generated with Claude Code