A lightweight web-based APRS monitoring dashboard for Direwolf and DigiPi, designed to run on a Raspberry Pi with no internet connection required.
Repo: https://github.com/hemna/direwolf-dashboard
Release: v1.1.0
Open: Click the 📋 toolbar button or press S
A sortable, filterable table of every station heard:
- Columns: Callsign (with APRS symbol icon), Last Heard (live-updating age), Packets, Position
- Click any column header to sort; click again to reverse
- Type in the search box to filter by callsign
- Click Focus on a row to pan the map to that station
- Click 📾 Export CSV to download the full station list as a spreadsheet-ready CSV file
Open: Click the ⌨ toolbar button or press ?
All keyboard shortcuts in one place:
| Key | Action |
|---|---|
S |
Open / close Station List |
W |
Open / close Weather Stations panel |
M |
Open / close APRS Messages panel |
L |
Cycle packet log (expanded → hidden → back) |
Ctrl+F |
Focus log search box |
Ctrl+K |
Open Decode APRS Packet |
? |
Show keyboard shortcuts |
Esc |
Close any open modal |
Open: ⚙ Settings → Log Colors section
All 8 color slots in the compact packet log are now customizable via color pickers:
- RX packets, TX packets, packet type, comment, human info, bearing, distance, dimmed text
- Colors are saved to
localStorageand persist across page reloads - Reset to Defaults restores the active theme's original colors
Inline in the packet log — no action needed.
RX packets that include an audio level reading from the Direwolf log show a 5-bar signal strength indicator next to the packet type:
- 1–3 bars (grey) = normal signal
- 4 bars (yellow) = strong signal
- 5 bars (red) = overloaded / clipping
Open: Press Ctrl+F / Cmd+F, or expand the Filters overlay and use the Search input
Live-filters the packet log as you type. Searches across:
- Callsign (from/to)
- Raw packet string
- Comment field
- Human-readable info (speed, altitude, etc.)
Works alongside the existing Callsign / Type / TX-RX filters simultaneously.
Open: Click the ⛅ toolbar button or press W
A dedicated panel for all weather stations (_ symbol) heard:
- Columns: Callsign, Temp (°F), Wind (mph + direction), Humidity (%), Pressure (mb), Last Report age
- Sortable by any column
- Charts button opens the weather history modal (temperature & pressure charts over 24 h)
- Auto-refreshes every 60 seconds while open
Also: Weather station map popups now show current conditions inline — temp, wind, and humidity appear directly in the popup without needing to click "View Weather".
Open: Click the 💬 toolbar button or press M
A dedicated view of all APRS MessagePacket traffic, grouped into conversation threads:
- Each thread shows the full exchange between two callsigns, in chronological order
- Threads addressed to your own callsign are highlighted in blue and sorted to the top
- Enter your callsign in the My Call field (saved to
localStorage) - Filter box narrows threads by callsign
- Auto-refreshes every 30 seconds while open
Open: ⚙ Settings → Storage → 📾 Export Packets CSV
Downloads all stored packets as direwolf-packets.csv with 16 columns:
timestamp, datetime (ISO 8601 UTC), type, tx (0/1), from_call, to_call,
path (semicolons), latitude, longitude, symbol, symbol_table,
human_info, comment, msg_no, audio_level, raw_packet
Direct URL filters (open in browser or curl):
GET /api/packets/export # all packets (up to 10 000)
GET /api/packets/export?callsign=WB4BOR # one station only
GET /api/packets/export?type=GPSPacket # GPS packets only
GET /api/packets/export?since=1700000000 # since a Unix timestamp
GET /api/packets/export?limit=500 # cap row count
GET /api/health
Returns {"status":"ok","uptime_seconds":N} (HTTP 200) when AGW and log tailer are both active.
Returns {"status":"degraded","issues":[...]} (HTTP 503) if either has dropped.
Useful for systemd ExecStartPost health checks, monitoring tools, and uptime dashboards.
- APRS symbol sprites now vendored locally — no internet required; works on air-gapped DigiPi
- XSS vulnerability eliminated in station map popups (popup buttons now use
addEventListenerinstead of inlineonclickattributes with embedded callsign strings) my_positioncached in memory — eliminates hundreds of per-packet SQLite round-trips on busy APRS channels- DB transaction rollback on errors — a failed packet write no longer leaves the SQLite connection in a broken state
- Housekeeping loop jitter — sleep interval is ±5% randomized to prevent predictable SD card write bursts on DigiPi
asyncio.get_running_loop()replaces deprecatedget_event_loop()in tile proxy (Python 3.12 compat)
# On the DigiPi / Raspberry Pi
cd ~/direwolf-dashboard
git pull origin master
uv pip install -e .
sudo systemctl restart direwolf-dashboard
# Health check
curl http://localhost:8088/api/healthBuilt for DigiPi by WB4BOR — fully offline, no CDN, no external dependencies.