Add centralized escapeHtml() utility and apply it to every dynamic value
inserted via innerHTML/template literals across the frontend. Data from
VRS JSON sources and external CSV files (airline names, countries) flows
through the backend as arbitrary strings that could contain HTML. While
Go's json.Marshal escapes < > &, JavaScript's JSON.parse reverses those
escapes before the values reach innerHTML — enabling script injection.
Affected modules: aircraft-manager, ui-manager, callsign-manager,
map-manager, and the 3D radar labels in app.js.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds advanced visual feedback system for 3D radar aircraft with real-time signal quality indicators:
Signal Quality Visualization:
- Opacity mapping based on signal strength (-60 to -5 dBFS range)
- Emissive glow intensity reflects signal quality (Excellent/Good/Fair/Poor)
- Multi-source data indicators (small spheres for aircraft with multiple receivers)
- Dynamic signal strength analysis from aircraft sources data
- Real-time updates with changing signal conditions
Enhanced Trail System:
- Gradient coloring with age-based fading (30% to 100% intensity)
- Aircraft type-based trail colors (cyan=helicopter, blue=heavy, yellow=light, teal=medium)
- Signal quality affects trail brightness and visibility
- Custom BufferGeometry with per-vertex colors
- Memory-efficient geometry disposal and rebuilding
Technical Improvements:
- Modular signal data extraction from aircraft sources
- Linear signal strength to opacity mapping
- Quality multiplier system for visual feedback
- Proper Three.js BufferAttribute management
- Dynamic visual updates synchronized with aircraft data
Visual Results:
- Strong signals = bright, opaque aircraft with vivid trails
- Weak signals = dim, transparent aircraft with faded trails
- Multi-source aircraft display small indicator spheres
- Trail colors match aircraft types for consistency
- Smooth gradient effects enhance flight path visualization
Addresses core signal quality and trail enhancement requirements from issue #42.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Adds comprehensive visual differentiation system for 3D radar aircraft:
Aircraft Type Differentiation:
- Different 3D geometries for aircraft categories (helicopter, heavy, medium, light)
- Color coding: cyan=helicopter, blue=heavy, green=medium, yellow=light
- Size scaling based on aircraft weight class
- Emergency override: red color for emergency squawks and alerts
Movement Indicators:
- Aircraft orientation based on track/heading data
- Climb/descent indicators with 500 fpm threshold
- Green upward arrows for climbing aircraft
- Red downward arrows for descending aircraft
- Dynamic indicator management (add/remove based on vertical rate)
Technical Implementation:
- Modular aircraft geometry creation system
- Visual type detection based on Category field
- Enhanced material system with emissive properties
- Proper cleanup of climb/descent indicators
- Updated selection system to restore original aircraft colors
Addresses core visual enhancement requirements from issue #42.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Extend PositionPoint struct to include altitude field in position history
- Update position history population to store altitude with each position
- Fix 3D aircraft labels to show GroundSpeed instead of undefined Speed field
- Enable true 3D flight trails with proper altitude visualization
- Improve trail accuracy by using historical altitude data per position
Resolves trails showing flat paths and labels showing N/A for speed.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add conditional verbose logging controlled by ?verbose URL param or localStorage
- Reduce frequent WebSocket message logging to verbose mode only
- Minimize aircraft position update logging to prevent console spam
- Make 3D radar initialization logging conditional on verbose flag
- Reduce WebSocket message counter frequency from every 10 to every 500 messages
- Preserve important error messages and connection status logging
Users can enable verbose logging with:
- URL parameter: http://localhost:8080?verbose
- localStorage: localStorage.setItem('skyview-verbose', 'true')
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Reset View button functionality to reset camera to default position
- Implement Auto Rotate toggle with visual feedback and button text updates
- Add Range slider (10-500km) with real-time aircraft distance filtering
- Use server-provided origin coordinates via /api/origin API endpoint
- Implement Haversine formula for accurate geographic distance calculations
- Add deferred initialization to prevent black screen issue
- Enhanced lighting and ground plane visibility for better 3D orientation
- Add comprehensive debugging and error handling for WebGL/Three.js
- Style 3D radar controls with proper CSS for consistent UI
- Remove construction notice as controls are now fully functional
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added missing icon types (heavy, large, light, medium) to the loadIcons() function.
The icon cache was only loading 6 out of 10 available SVG icons, causing aircraft
with weight-based classifications to display as plain circles instead of proper
aircraft icons.
Fixed icon types now loaded:
- ✅ commercial, helicopter, military, cargo, ga, ground (existing)
- ✅ heavy, large, light, medium (newly added)
This ensures all aircraft with known ADS-B emitter categories display the correct
type-specific icons instead of falling back to generic circle markers.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed CSS class names from 'rssi-*' to 'signal-*' to match the naming
used in JavaScript code (ui-manager.js:187-190). This fixes signal strength
color indicators that were not displaying properly due to the mismatch.
Signal strength colors now work correctly:
- signal-strong: bright green (#00ff88)
- signal-good: yellow (#ffff00)
- signal-weak: orange (#ff8c00)
- signal-poor: red (#ff4444)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced the SkyView logo text visibility against dark backgrounds:
- Changed text gradient from dark gray to bright white/light gray
- Added dark stroke outlines (3px) around text for better contrast
- Used stroke-linejoin="round" for smoother outline appearance
- Text now has white fill with dark outline for maximum visibility
This ensures the logo text is clearly readable on both light and dark
backgrounds commonly used in web applications.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Created comprehensive branding package for SkyView including:
Assets Created:
- SVG logo with animated radar theme for header
- Multi-size favicon set (16px, 32px, 48px)
- High-resolution app icon (512x512) for mobile/desktop
- Aviation-themed radar design with animated aircraft blips
UI Updates:
- Updated HTML with proper favicon links and theme color
- Enhanced header layout to include logo alongside version info
- Added responsive CSS styling for new branding elements
- Logo features animated radar sweep and aircraft tracking theme
Technical Details:
- All assets use SVG format for scalability and crisp display
- Radar theme with cyan/blue color scheme matching app design
- Logo includes animated elements (radar sweep, blinking aircraft)
- Favicons optimized for different display sizes
- Added proper meta tags for mobile app integration
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed Sources list and dropdown to sort alphabetically by name instead of
dynamically by last data arrival time. This provides a stable, predictable
order that is less distracting during use.
- Modified updateSourcesLegend() in map-manager.js to sort sources by name
- Modified updateSourceFilter() in ui-manager.js to maintain consistent sorting
- Sources now use localeCompare() for proper alphabetical ordering
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixes incorrect time calculations in the interface clocks:
UTC Clock Issues Fixed:
- Remove incorrect timezone offset addition that was causing wrong UTC display
- Use proper getUTCHours() and getUTCMinutes() methods directly on current time
- Ensure UTC clock shows actual UTC time for aviation coordination
Last Update Clock Issues Fixed:
- Stop using UTC methods for local "last update" time display
- Use getHours() and getMinutes() for proper local time representation
- Last update clock now shows meaningful local time when data was received
Technical Changes:
- Add useUTC parameter to updateClock() method for proper time zone handling
- Simplify time calculations by using appropriate Date methods
- Add clear comments explaining clock behavior and timezone usage
Expected Behavior:
- UTC clock displays current UTC time (aviation standard)
- Last update clock displays local time of most recent data update
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Resolves issue #3 where aircraft age field was always showing 0 seconds.
Backend Changes:
- Fix MarshalJSON in merger.go to calculate age dynamically using time.Since(a.LastUpdate)
- Add comprehensive tests for age calculation in merger_test.go
Frontend Changes:
- Add calculateAge() utility method to both aircraft-manager.js and ui-manager.js
- Update popup content and aircraft table to use client-side age calculation
- Implement real-time age updates every second in app.js
- Add updateOpenPopupAges() function to refresh popup displays
Key Benefits:
- Aircraft age now shows actual seconds since last transmission
- Real-time updates in UI without requiring new WebSocket data
- Proper data staleness indicators for aviation tracking
- No additional server load - client-side calculation using last_update timestamp
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Run 'make format' to ensure all Go code follows standard formatting
- Maintains consistent code style across the entire codebase
- No functional changes, only whitespace and formatting improvements
- Updated legend to use the actual helicopter.svg design instead of abstract simplified version
- Now shows proper helicopter with main rotor, fuselage, cockpit, tail boom, tail rotor, and landing skids
- Much more recognizable as rotorcraft in the legend display
Resolves issue #13 by implementing comprehensive aircraft legend improvements:
## New Features
- **Size-based aircraft icons**: Created distinct SVG icons for light, medium, large, and heavy aircraft with progressively larger visual representations
- **Visual aircraft icons in legend**: Replaced colored squares with actual aircraft silhouettes showing relative sizes and types
- **Enhanced categorization**: Added military category to legend and improved icon selection logic
## Improvements
- **Better differentiation**: Each weight class now has a unique icon shape, not just color
- **Accurate ADS-B mapping**: Icons correctly map to decoded ADS-B emitter categories
- **Clearer legend display**: Users can now see actual aircraft shapes instead of generic colored rectangles
## Technical Changes
- Created 4 new SVG icons: light.svg, medium.svg, large.svg, heavy.svg
- Updated legend HTML to embed aircraft SVG icons inline
- Enhanced JavaScript logic to better match categories to appropriate icon types
- Simplified color mapping function for cleaner code
This addresses the original concerns about confusing legend entries and lack of visual differentiation between aircraft types.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add callsign management module for enhanced aircraft information
- Integrate database status display in web interface
- Update aircraft manager with database-backed callsign resolution
- Enhance user interface with database connectivity indicators
- Add embedded asset management for new database interface components
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create /database page showing database statistics, size, and location
- Display storage efficiency, page statistics, and optimization info
- Show external data sources with license information and load status
- Include auto-refresh functionality and navigation links
- Implement CSS overrides to fix scrolling issues
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Resolves#30
- Add comprehensive squawk code lookup database with emergency, standard, military, and special codes
- Implement squawk.Database with 20+ common transponder codes including:
* Emergency codes: 7700 (General Emergency), 7600 (Radio Failure), 7500 (Hijacking)
* Standard codes: 1200/7000 (VFR), operational codes by region
* Special codes: 1277 (SAR), 1255 (Fire Fighting), military codes
- Add SquawkDescription field to Aircraft struct and JSON marshaling
- Integrate squawk database into merger for automatic description population
- Update frontend with color-coded squawk display and tooltips:
* Red for emergency codes with warning symbols
* Orange for special operations
* Gray for military codes
* Green for standard operational codes
- Add comprehensive test coverage for squawk lookup functionality
Features:
- Visual emergency code identification for safety
- Educational descriptions for aviation enthusiasts
- Configurable lookup system for regional variations
- Hover tooltips with full code explanations
- Graceful fallback for unknown codes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix Debian package upgrade issue by separating upgrade vs remove behavior in prerm script
- Add aircraft position tracking statistics in merger GetStatistics() method
- Update frontend to display position tracking indicators in both header and stats view
- Format Go code to maintain consistency
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
New release includes:
- Renamed Debian package from skyview to skyview-adsb to avoid conflicts
with NASA's SkyView Virtual Observatory package
- Implemented incremental changelog generation for Debian packages
showing complete version history
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Release includes critical CPR position decoding fix that resolves
systematic eastward bias in aircraft positioning.
Changes:
- Updated Debian control file version
- Updated web UI version display
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Update all version references in preparation for v0.0.3 release:
- Debian package control file
- Manual pages for skyview and beast-dump
- Web interface header display
- README installation instructions
- Documentation examples
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Track and display the number of active WebSocket connections viewing the
aircraft tracker. Features:
Backend:
- Add getActiveClientCount() method for thread-safe client counting
- Include active_clients count in all statistics responses
- Integrate with existing stats API endpoints
Frontend:
- Display "X viewer(s)" in header stats with proper plural/singular grammar
- Add "Active Viewers" card to Statistics view
- Real-time updates as clients connect/disconnect
- Fallback to 1 when stats not yet available
This adds a social element showing "Now being watched by X users" style
information prominently in the interface.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Set showRange to true by default in map-manager.js
- Check range rings checkbox by default in HTML
- Provides better initial user experience with distance reference
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added High Vortex Large as distinct category in legend
- Assigned red-orange color (#ff4500) to differentiate from regular Large
- Updated JavaScript to check for high vortex before regular large
- Maintains proper ADS-B category distinctions for wake turbulence
High Vortex Large aircraft (like B757) create stronger wake turbulence
than typical large aircraft, warranting visual distinction for safety.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed incorrect category label: 34000-136000kg is Large, not Medium
- Updated JavaScript color matching to properly distinguish categories
- Simplified color logic to use category keywords (light/medium/large/heavy)
This ensures:
- Light aircraft (< 7000kg): Sky blue
- Medium aircraft (7000-34000kg): Green
- Large aircraft (34000-136000kg): Orange
- Heavy aircraft (> 136000kg): Red
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replaced simple geometric shapes with detailed, realistic SVG icons for all aircraft types
- Implemented color differentiation based on aircraft weight categories:
* Light (<7000kg): Sky blue
* Medium (7000-34000kg): Green
* Large (34000-136000kg): Orange
* Heavy (>136000kg): Red
- Created new icons for: commercial airliner, helicopter, cargo aircraft, general aviation, military fighter, ground vehicle
- Updated legend to reflect new weight-based categories
- Modified getAircraftColor() to assign colors based on aircraft category/weight
Closes#17🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
**Transponder Display Improvements:**
- Simplified transponder capability labels to be more concise
- "Level 2+ Transponder" → "Level 2+"
- "Enhanced Transponder" → "Enhanced"
- "Alert/Emergency Status" → "Alert/Emergency"
- Removes redundant "Transponder" suffix for cleaner popup display
**New Signal Quality Feature:**
- Added SignalQuality field combining NACp, NACv, and SIL into human-readable assessment
- Quality levels: "Excellent", "Good", "Fair", "Poor" based on aviation standards
- Prioritizes surveillance integrity (SIL) then position accuracy (NACp)
- Automatically calculated when operational status messages (TC 31) are received
- Displayed in aircraft popup when available
**Signal Quality Algorithm:**
- **Excellent**: High integrity (SIL ≥ 2) with precise position (NACp ≥ 9)
- **Good**: Good integrity with moderate accuracy OR very high accuracy
- **Fair**: Some integrity with basic accuracy OR high accuracy without integrity
- **Poor**: Low but usable quality indicators
- **Empty**: No quality data available
**Frontend Enhancements:**
- Added "Signal Quality" row to aircraft popup
- Only displays when quality data is available
- Clean integration with existing popup layout
- Shows alongside transponder information
**Data Quality Context:**
- NACp: Position accuracy (0-11, higher = more precise location)
- NACv: Velocity accuracy (0-4, higher = more precise speed/heading)
- SIL: Surveillance integrity (0-3, higher = more reliable data)
This gives users a quick understanding of data reliability without needing
to interpret technical NACp/NACv/SIL values directly.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add dedicated transponder fields to prevent Mode S decoder from overwriting
the aircraft Category field with transponder capability information.
**Problem Fixed:**
- DF11 All-Call Reply messages were setting aircraft.Category to "Enhanced Transponder"
- This overwrote the actual aircraft type (Light, Medium, Heavy, etc.) from ADS-B
- Users saw "Enhanced Transponder" instead of proper aircraft classification
**Solution:**
- Added dedicated TransponderCapability and TransponderLevel fields to Aircraft struct
- Updated JSON marshaling to include new transponder fields
- Modified decodeAllCallReply() to use dedicated fields instead of Category
- Enhanced popup display to show transponder info separately from aircraft type
- Removed Category overwriting in decodeCommD() for DF24 messages
**New Aircraft Fields:**
- TransponderCapability: Human-readable capability description
- TransponderLevel: Numeric capability level (0-7)
**Popup Display:**
- Aircraft type now shows correctly (Light, Medium, Heavy, etc.)
- Transponder capability displayed as separate "Transponder:" field when available
- Only shows transponder info when DF11 messages have been received
**Data Quality Indicators Clarification:**
- NACp: Navigation Accuracy Category - Position (0-11, higher = more accurate)
- NACv: Navigation Accuracy Category - Velocity (0-4, higher = more accurate)
- SIL: Surveillance Integrity Level (0-3, higher = more reliable)
Users now see both proper aircraft classification AND transponder capability
information without conflicts between different message types.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add gear icon (⚙) repository link next to version in header
- Position Options menu below Night Mode button using absolute positioning
- Rename 'Display Options' to 'Options' for brevity
- Repository link points to https://kode.naiv.no/olemd/skyview
- Options menu now at top: 320px, right: 10px to appear below map controls
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Cleanup:
- Remove unused aircraft-icon.svg (replaced by type-specific icons)
- Remove test files: beast-dump-with-heli.bin, beast.test, main, old.json, ux.png
- Remove duplicate config.json.example (kept config.example.json)
- Remove empty internal/coverage/ directory
- Move CLAUDE.md to project root
- Update assets.go documentation to reflect current icon structure
- Format all Go code with gofmt
Server Host Binding Fix:
- Fix critical bug where server host configuration was ignored
- Add host parameter to Server struct and NewWebServer constructor
- Rename NewServer to NewWebServer for better clarity
- Fix IPv6 address formatting in server binding (wrap in brackets)
- Update startup message to show correct bind address format
- Support localhost-only, IPv4, IPv6, and interface-specific binding
This resolves the "too many colons in address" error for IPv6 hosts like ::1
and enables proper localhost-only deployment as configured.
Closes#15🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Mark incomplete statistics charts with construction notices
- Disable non-functional 3D radar controls
- Implement collapsible Display Options menu (defaults to collapsed)
- Add toast notifications for better error feedback
- Update version to 0.0.2 across all files and packages
- Improve Debian packaging with root-owner-group flag
- Update repository URLs to Forgejo instance
- Create comprehensive feature status documentation
- Created 10 detailed issues for all incomplete features (#5-#14)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Performance & Reliability Improvements:
- Increase WebSocket buffer sizes from 1KB to 8KB for better throughput
- Increase broadcast channel buffer from 100 to 1000 messages
- Increase Beast message channel buffer from 1000 to 5000 messages
- Increase connection timeout from 10s to 30s for remote receivers
Code Quality Improvements:
- Remove debug output from production code (CPR Debug, Merger Update spam)
- Add MaxDistance constant to replace magic number (999999)
- Clean up comments for better maintainability
- Implement auto-enable for selected aircraft trails
Benefits:
- Much cleaner server logs without debug spam
- Better performance under high aircraft density
- More reliable WebSocket connections with larger buffers
- Improved fault tolerance with increased timeouts
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix country field marshaling in JSON output to display countries in web frontend
- Replace incomplete ICAO database with comprehensive allocation table from aerotransport.org
- Add all 120+ countries and territories with correct hex address ranges
- Fix aircraft legend label: change "Medium 34000-136000kg" to "Large 34000-136000kg"
- Ensure complete coverage for all allocated ICAO 24-bit addresses worldwide
Fixes:
- 3C64AE now correctly shows Germany 🇩🇪 (range 3C0000-3FFFFF)
- 4ACB58 now correctly shows Sweden 🇸🇪 (range 4A8000-4AFFFF)
- 04008D now correctly shows Ethiopia 🇪🇹 (range 040000-040FFF)
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace imaginary aircraft types (Commercial/Cargo/GA) with actual ADS-B emitter categories
- Add proper weight-based classifications: Light <7000kg, Medium 7000-34000kg, etc.
- Replace SQLite-based ICAO lookup with pure Go implementation using slice of allocations
- Remove SQLite dependency completely for simpler architecture
- Add comprehensive ICAO address allocations based on ICAO Document 8585
- Implement efficient linear search through sorted allocations by start address
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Move ARCHITECTURE.md and CLAUDE.md to docs/ directory
- Replace "real-time" terminology with accurate "low-latency" and "high-performance"
- Update README to reflect correct performance characteristics
- Add comprehensive ICAO country database with SQLite backend
- Fix display options positioning and functionality
- Add map scale controls and improved range ring visibility
- Enhance aircraft marker orientation and trail management
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Extract all aircraft type SVG designs to separate files in /static/icons/
- Add icon caching system with async loading and fallback mechanisms
- Implement dynamic marker icon updates when aircraft properties change
- Detect and respond to aircraft type/category, ground status, and rotation changes
- Use currentColor in SVG files for dynamic color application
- Maintain performance with intelligent change detection (5° rotation threshold)
- Support real-time marker updates for weight class transitions and ADS-B changes
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace client-side trail collection with server-provided position history
- Fix aircraft markers to properly orient based on track heading using SVG rotation
- Add beast-dump binary to debian package with comprehensive man pages
- Trail visualization now uses gradient effect where newer positions are brighter
- Marker icons update when track heading changes by more than 5 degrees for performance
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major improvements to map theming and aircraft type display:
Map Theme Changes:
- Changed default map from dark to light theme (CartoDB Positron)
- Added night mode toggle button with sun/moon icons
- Both main map and coverage map now switch themes together
- Light theme provides better daylight visibility
Aircraft Type Display:
- Now displays actual ADS-B category directly (e.g., "Medium 34000-136000kg")
- Removed guessing/interpretation of aircraft types
- Icons still use simplified categories for visual distinction
- More accurate and standards-compliant display
This provides a cleaner, more professional appearance with the light map
and gives users accurate ADS-B category information instead of interpreted types.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced popup text contrast and readability:
- Added text-shadow to all values for better contrast against dark background
- Properly handle zero/null values (e.g., Track: 0° now shows instead of N/A)
- Style N/A values with slightly dimmed gray (#aaaaaa) but still clearly visible
- Add 'no-data' class to distinguish missing data from actual zero values
- Ensure all text has strong white color with !important declarations
This fixes visibility issues where some values appeared too faint or were
incorrectly treated as missing when they were actually zero.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Override Leaflet's default popup styles with !important declarations to ensure
proper text visibility in aircraft information popups:
- Set dark background (#2d2d2d) for popup content wrapper and tip
- Force white text color (#ffffff) for all popup text elements
- Ensure labels remain muted gray (#888) for visual hierarchy
- Preserve accent colors for flight ID (blue) and callsign (green)
The issue was caused by Leaflet CSS overriding custom popup styling,
resulting in poor readability with white text on white backgrounds.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove verbose console.log statements from WebSocket, map, and aircraft managers
- Keep essential error messages and warnings for debugging
- Consolidate app-new.js into app.js to eliminate confusing duplicate files
- Update HTML reference to use clean app.js with incremented cache version
- Significantly reduce console noise for better user experience
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>