- Add/remove callsigns, registrations, or ICAO codes to watch
- Alert notification and sound when watched aircraft detected
- Filter view to show only watched aircraft
- Visual highlighting with cyan border and star icon
- Watchlist persisted to localStorage
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Click any aircraft's squawk code to see its meaning and a full
reference table of common codes. Emergency codes highlighted in red.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update browser titles and headers across all pages with the new
tagline. Add 'Signal Intelligence Platform' as subtitle.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Backend route to proxy photo requests from Planespotters API
- Frontend displays photo in Selected Target panel when available
- Photos are cached to avoid repeated API calls
- Clicking photo links to full image on Planespotters.net
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove direct serial GPS dongle support in favor of gpsd daemon connectivity.
The UI now auto-connects to gpsd on page load and shows a GPS indicator when connected.
Simplify ADS-B dashboard controls bar for a cleaner, more compact layout.
Add setup-dev.sh for streamlined development environment setup.
- Remove GPSReader class and NMEA parsing (utils/gps.py)
- Consolidate to GPSDClient only with auto-connect endpoint
- Add GPS indicator with pulsing dot animation
- Compact controls bar with smaller fonts and tighter spacing
- Add aircraft database download banner/functionality
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed /spectrum/audio/* to /listening/audio/* to match the
actual listening_post blueprint URL prefix.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Listening Post actually uses ffmpeg for audio encoding, not sox.
Updated all documentation, setup scripts, and code to reflect this:
- Removed unused find_sox() function from listening_post.py
- Simplified tools endpoint to only check for ffmpeg
- Updated CHANGELOG, README, HARDWARE.md, Dockerfile
- Fixed setup.sh to check for ffmpeg
- Updated frontend warnings to mention ffmpeg
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enhanced /adsb/tools endpoint to detect SoapySDR hardware and check for readsb
- Added UI warning in aircraft dashboard when HackRF/LimeSDR is detected but readsb is missing
- Warning includes expandable installation instructions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Listening Post mode with frequency scanner and audio monitoring
- Add dependency warning for aircraft dashboard listen feature
- Auto-restart audio when switching frequencies
- Fix toolbar overflow on aircraft dashboard custom frequency
- Update setup script with full macOS/Debian support
- Clean up README and documentation for clarity
- Add sox and dump1090 to Dockerfile
- Add comprehensive tool reference to HARDWARE.md
- Add correlation, settings, and database utilities
- Add new test files for routes, validation, correlation, database
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Airspy support:
- Add AIRSPY to SDRType enum and driver mappings
- Create AirspyCommandBuilder using SoapySDR tools (rx_fm, readsb, rtl_433)
- Register in SDRFactory and add to hardware type dropdown
- Supports Airspy R2/Mini (24MHz-1.8GHz) and HF+ devices
GPS coordinate persistence:
- Save observer location to localStorage when manually entered or via geolocation
- Restore saved coordinates on page load in both index.html and adsb_dashboard.html
- Coordinates are shared between both pages
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features:
- Add rtl_tcp support for pager and sensor decoding
- Connect to remote RTL-SDR via rtl_tcp server
- New UI toggle and host:port inputs in sidebar
- Supports rtl_fm and rtl_433 with remote devices
- Add remote dump1090 support for ADS-B tracking
- Connect to dump1090 SBS output on remote machine
- New "Remote" checkbox with host:port in ADS-B dashboard
Backend changes:
- Add rtl_tcp_host/port fields to SDRDevice dataclass
- Add is_network property for detecting remote devices
- Update RTLSDRCommandBuilder to use rtl_tcp:host:port format
- Add create_network_device() to SDRFactory
- Add validate_rtl_tcp_host/port validation functions
- Update pager, sensor, and adsb routes to accept remote params
Note: dump1090 doesn't support rtl_tcp directly - use remote
dump1090's SBS output (port 30003) for remote ADS-B tracking.
Moved CSS files for ADS-B and satellite dashboards, as well as the main index page. Updated screenshot image paths in the README and moved screenshot files to a dedicated images/screenshots directory. Adjusted HTML templates to use the new path for the CSS files.
- Add GPS dongle support with NMEA parsing (utils/gps.py, routes/gps.py)
- Add GPS device selector to ADS-B and Satellite observer location sections
- Add GPS dongle option to ADS-B dashboard
- Fix Python 3.7/3.8 compatibility by adding 'from __future__ import annotations'
to all SDR module files (fixes TypeError: 'type' object is not subscriptable)
- Add pyserial to requirements.txt
- Update README with GPS dongle documentation and troubleshooting
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Aircraft Trails: altitude-based color gradient with fading opacity
- Virtual Radar Scope (PPI): canvas-based with sweep animation, range rings, compass rose
- UI Overhaul: controls bar at bottom, compact stats in header, MAP/RADAR view toggle
- Range selector syncs with both map rings and radar scope
- Click-to-select aircraft works in both map and radar views
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
GPS geolocation only works on HTTPS or localhost. Added manual lat/lon
input fields so users can enter their coordinates directly when
accessing the app over HTTP on a local network.
- Added latitude/longitude input fields to both ADS-B tab and dashboard
- GPS button now checks for secure context before attempting geolocation
- Shows helpful error message directing users to use manual input
- Input fields update observer location and redraw range rings on change
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New features for both ADS-B tab and dashboard:
1. Range Rings - Concentric circles at 25, 50, 100, 150, 200nm showing
distance from observer location with dashed styling and labels
2. Statistics Panel - Tracks:
- Max range achieved (with aircraft that achieved it)
- Total unique aircraft seen this session
- Messages per second rate
- Busiest hour of tracking
3. Geolocation Button - Gets user's actual GPS location to:
- Center the map on their position
- Calculate accurate distances for range statistics
- Position range rings correctly
4. Reception Statistics - Real-time msg/sec counter to monitor
receiver performance
All features work on both the ADS-B tab and full-screen dashboard.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The UK range 0x400000-0x43FFFF was the entire UK allocation, not just
military - this incorrectly flagged civilian airlines like EasyJet
(EZY callsign) as military aircraft.
Fixed ranges:
- Removed broad UK range, kept only RAF sub-range 0x43C000-0x43CFFF
- Narrowed France range to actual military 0x3F4000-0x3F7FFF
- Fixed Germany to correct Luftwaffe range 0x3D0000-0x3DFFFF
- Fixed typo in US range (0xADFFFFF -> 0xADFFFF)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features:
- Audio alert plays when military aircraft or emergency squawk code
(7500/7600/7700) is first detected
- Different tones: two-tone urgent alert for emergencies, single tone
for military aircraft
- Visual banner notification appears at top of screen for 5 seconds
- Toggle checkbox to enable/disable audio alerts
- Alerts only trigger once per aircraft to avoid spam
- Implemented on both ADS-B tab and full-screen dashboard
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add aircraft filter dropdown (All/Military/Civil/Emergency) to both
main dashboard and full-screen ADS-B dashboard
- Military detection uses ICAO hex ranges and callsign prefixes
- Military aircraft display olive drab markers and MIL badges
- Fix aircraft icon rotation in adsb_dashboard.html by replacing
emoji (✈) with SVG icon - emoji had inconsistent orientation
across platforms causing incorrect heading display
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add requestAnimationFrame batching to WiFi SSE handler to prevent
freeze with many access points
- Add requestAnimationFrame batching to Bluetooth SSE handler to
prevent freeze with many devices
- Move channel graph updates to batched frame instead of per-network
- Throttle probe analysis updates to every 2 seconds
- Optimize aircraft tracking in main page with marker state caching,
150 marker limit, and throttled auto-fit bounds
- Add "Full Screen Dashboard" links to aircraft and satellite modes
- Add "Main Dashboard" links to ADSB and satellite dashboards
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use requestAnimationFrame to throttle expensive rendering operations.
Previously every SSE message triggered full UI re-renders causing
browser unresponsiveness with 50+ aircraft.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend was sending 'alt' but frontend expected 'altitude'.
Standardized on 'altitude' throughout.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Split monolithic intercept.py (15k lines) into modular structure:
- routes/ - Flask blueprints for each feature
- templates/ - Jinja2 HTML templates
- data/ - OUI database, satellite TLEs, detection patterns
- utils/ - dependencies, process management, logging
- config.py - centralized configuration with env var support
- Add type hints to function signatures
- Replace bare except clauses with specific exceptions
- Add proper logging module (replaces print statements)
- Add environment variable support (INTERCEPT_* prefix)
- Add test suite with pytest
- Add Dockerfile for containerized deployment
- Add pyproject.toml with ruff/black/mypy config
- Add requirements-dev.txt for development dependencies
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>