- Add offscreen canvas for double buffering
- Draw all elements to offscreen canvas first
- Copy to visible canvas in single operation
- Increase update intervals (150ms throttle, 2s refresh)
- Eliminates flashing when visualization redraws
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace heatmap with concentric distance zones (Very Close, Close, Nearby, Far)
- Each zone has distinct color coding and shows device counts
- Device dots persist with smooth fading for stale devices (30s threshold)
- Random angle distribution prevents dot overlap
- Glow effect on dots with color based on signal strength
- Periodic refresh timer keeps visualization smooth during inactive periods
- Throttled updates prevent performance issues during rapid scanning
- Center "YOU" marker with subtle glow effect
- Shows instructional text when idle
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace proximity radar with persistent heatmap visualization using radial gradients
- Change device card click to populate Selected Device panel instead of modal
- Fix Device Types panel with proper categorization (phones, computers, audio, wearables)
- Add tracker detection for AirTag, Tile, SmartTag, Chipolo patterns
- Add Apple FindMy Network detection using manufacturer ID 0x004C
- Fix Signal Distribution histogram with Close/Medium/Far/Weak bands
- Make Device Activity timeline collapsible and collapsed by default
- Add contextual "No data" messages for all empty panels
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features added:
- Click-to-open modal with comprehensive device details
- Signal strength with min/max/median/confidence stats
- Device info grid (address, type, manufacturer)
- Observation stats (first/last seen, count)
- Service UUIDs display
- Copy address button
- Live visualization panel updates:
- Device Types (phones, computers, audio, wearables, other)
- Signal Distribution (strong/medium/weak with bars)
- Tracker Detection list
- FindMy devices list
- Proximity Radar canvas:
- Plots devices by RSSI (closer = nearer center)
- Color-coded by signal strength
- Glow effect for visibility
- Improved device name display:
- Shows broadcast name if available
- Falls back to formatted address (AA:BB:...:EE:FF)
- Cards now clickable with hover effect
- Stats recalculated on each device update
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove all CSS class dependencies from device cards
- Use data-bt-device-id attribute instead of class-based selectors
- Add comprehensive inline styles to each element
- Change container from grid to block layout
- Add detailed console logging for debugging
- Remove potential CSS conflicts from .signal-card class
This isolates the card rendering from any CSS that might be
hiding content (like overflow:hidden on .signal-card).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change card HTML generation from template literals to string concatenation
- This avoids potential issues with special characters in device data
- Also disable legacy handleBtDeviceImmediate when BluetoothMode exists
- Use device_id as fallback name if name is missing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Disable legacy addBtDeviceCard when BluetoothMode is active
- Clear device container when starting scan to remove legacy cards
- Fix grid CSS with explicit auto height and align-items: start
- Add visibility rules for all card body elements
- Reset devices map when clearing container
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit default values for all card template variables
- Add try/catch for JSON.stringify
- Add !important CSS rules to ensure card body visibility
- Use ID selector for btDeviceListContent grid layout
- Add console logging for debugging device data
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
DeviceCard.createDeviceCard() returns a DOM element, not an HTML string.
Use replaceWith() and prepend() instead of outerHTML and insertAdjacentHTML.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Bluetooth mode uses its own layout container (btLayoutContainer) which
contains btDeviceListContent for device cards. The output element is hidden
for Bluetooth mode. Also adds device count updates and clears placeholder
when scanning starts.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major changes:
- Add utils/bluetooth/ package with DBus scanner, fallback scanners
(bleak, hcitool, bluetoothctl), device aggregation, and heuristics
- New unified API at /api/bluetooth/ with REST endpoints and SSE streaming
- Device observation aggregation with RSSI statistics and range bands
- Behavioral heuristics: new, persistent, beacon-like, strong+stable
- Frontend components: DeviceCard, MessageCard, RSSISparkline
- TSCM integration via get_tscm_bluetooth_snapshot() helper
- Unit tests for aggregator, heuristics, and API endpoints
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace the dropdown details panel with a clickable card that opens
a modal dialog showing all signal information including raw data.
Action buttons (Copy/Mute) now float on hover.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add clickable APRS station badges that display raw packet data in a modal
- Integrate SignalGuess into sensor mode cards for frequency identification
- Standardize UI language across timeline and signal components
- Update frequency band naming for consistency (e.g., "Wi-Fi 2.4GHz" → "2.4 GHz wireless band")
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implements heuristic-based signal identification that provides
plain-English guesses for detected signals based on frequency,
modulation, bandwidth, and burst behavior.
Features:
- Python backend engine (utils/signal_guess.py)
- JavaScript client-side engine with UI components
- Hedged language output (never claims certainty)
- UK/EU and US region support
- Confidence levels (LOW/MEDIUM/HIGH)
- 50+ unit tests for deterministic verification
Supported signal types: FM broadcast, airband, cellular/LTE,
ISM bands (433/868/915/2.4GHz), TPMS, amateur radio, marine VHF,
DAB, pager networks, weather satellites, ADS-B, and more.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increase margin-bottom from 6px to 12px for better spacing
- Add flexbox centering to properly align icons
- Bump icon size to 28px for better visual balance
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add RTLAMR utility meter mode card to the mode selection grid
- Fix icons being nearly invisible by setting color to --text-secondary
- Add explicit 24x24px sizing for mode card SVG icons
- Add cyan highlight on hover for icons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove waterfall UI panels from pager and 433MHz sections
- Remove associated JS functions (toggle, render, data tracking)
- Remove waterfall CSS styles
- Change recon mode to default to 'off' instead of 'on'
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove duplicated message counters from header (keeping output panel stats)
- Remove syncHeaderStats function and its 500ms polling interval
- Fix icon CSS override that caused stroke-based SVGs to render as solid squares
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace emojis throughout the codebase with inline SVG icons using
the Icons utility. Remove decorative icons where text labels already
describe the content. Add classification dot CSS for risk indicators.
- Extend Icons utility with comprehensive SVG icon set
- Update navigation, header stats, and action buttons
- Update playback controls and volume icons
- Remove decorative device type and panel header emojis
- Clean up notifications and alert messages
- Add CSS for classification status dots
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace emoji icons with inline SVG for WiFi, Bluetooth, and RF/SDR
indicators. Icons are standard symbols (arc, rune, wave) designed for
screenshot legibility in reports.
- Add Icons utility object in utils.js with SVG generators
- Add icon CSS system with sizing variants and state animations
- Update TSCM scanner indicators and capabilities bar
- Remove decorative sensor type emojis (text labels suffice)
- Keep signal strength SVG bars (already implemented)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Introduces standardized RSSI-to-label mapping (minimal/weak/moderate/strong/very_strong)
and duration-based confidence modifiers for client-facing reports and dashboards.
- New signal_classification.py module with hedged language generation
- Updated detector.py to use standardized signal descriptions
- Enhanced reports.py with signal classification in findings
- Added JS SignalClassification and signal indicator components
- CSS styles for signal strength bars and assessment panels
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Set panel height to 200px with overflow scroll
- Add padding-bottom for status bar clearance
- Make dashboard scrollable
- Remove flex constraints causing collapse
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Set min-height: 300px on main grid
- Set min-height: 120px on individual panels
- Set min-height: 80px on panel content
- Change dashboard from height: 100% to min-height: 100%
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increase lane min-height from 28px to 44px
- Widen label column from 100px to 140px
- Increase font sizes (freq: 11px, name: 10px)
- Add proper line-height and gap between lines
- Increase lanes container max-height to 240px
- Add more padding to label and track areas
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Make timeline collapsible (starts collapsed by default)
- Add header stats showing signal counts when collapsed
- Limit displayed lanes to 15 (scroll for more)
- Constrain max-height to 180px with scrollbar
- Add automatic pruning of old signals (keeps max 100)
- Show "+N more signals" indicator when truncated
- Reduce annotations max-height to 80px
- Preserve flagged signals during pruning
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New lightweight timeline component that shows RF signal presence
over time without heavy waterfall rendering:
- Horizontal swimlanes for each frequency/signal source
- Bars show transmission duration with height = signal strength
- Status colors: blue=new, gray=baseline, orange=burst, red=flagged
- Pattern detection for regular interval transmissions
- Click to expand and see individual transmission ticks
- Right-click to flag signals for investigation
- Auto-annotations for new signals, bursts, and patterns
- Tooltip with signal details on hover
- Time window selector (5m to 2h)
- Filter controls (hide baseline, show only new/burst)
Integrated into TSCM mode:
- Timeline created when TSCM mode is selected
- WiFi, Bluetooth, and RF signals feed into timeline
- Clears on new sweep start
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update applyAllFilters to look for filter bars in all possible
containers (main filterBarContainer and aprsFilterBarContainer)
so counts update automatically when new messages arrive.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extend signal cards to APRS, Sensors, and utility meter modes
- Add address tracking for automatic new/repeated/burst detection
- Create mode-specific filter bars with status and type filtering
- Add compact card variant for constrained layouts like APRS station list
- Add meter card type with consumption display and type-specific icons
- Refactor filter bar container to be shared across modes
- Add CSS for meter data display and distance display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create reusable signal-cards.css with status variants, protocol badges,
advanced panels, and filter bar styles
- Add signal-cards.js component for rendering pager message cards
- Integrate into pager mode with mute address, copy message, and
expandable details functionality
- Include interactive mockup for design reference
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added a new login.js script to provide visual feedback and prevent double submission on the login form. Updated login.html to include the script and wire up the login button. Clarified credential configuration instructions in README.md.
Increase sidebar width from 250px to 300px to prevent region dropdown
from being cut off. Add flex layout to keep header and controls visible
while messages area scrolls.
The #depsBtn and #helpBtn had old right positioning rules
that conflicted with the flex layout, causing them to appear
in wrong positions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove margin-left: auto from mode-nav-actions
- Set nav-utilities to use margin-left: auto for right alignment
- Increase gaps: nav-utilities 16px, nav-tools 12px
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Increased gap between tool buttons from 4px to 8px
- Added min-width to prevent button shrinking
- Added overflow: hidden to contain absolutely positioned icons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Both .mode-nav-actions and .nav-utilities had margin-left: auto,
causing them to compete for space in the flexbox layout.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add New Zealand (144.575 MHz) to APRS region dropdown
- Add Argentina, Brazil, and China regions
- Add custom frequency input option for user-specified frequencies
- Custom frequency field shows/hides dynamically when selected
- Properly disable/enable custom frequency control during operation
- CSS improvements for nav element flex behavior
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Revamps the login page layout and styles for a more modern, 'hacker' terminal look. Adds animated background effects, updates the login box and input styling, and enhances error messages with a new format. Also removes the tracked intercept.db file and ensures it is ignored in .gitignore.
Redesign the sidebar to be more minimal with collapsible sections
for Settings and Advanced options. Primary sweep action is now
prominently displayed, with tool buttons condensed to compact icons.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>