Analysis Tools
MeshShark (Packet Analyser)
MeshShark is a Wireshark-inspired live packet capture view. It shows every packet received by MeshDash with full decoding and filtering.
Live vs History Mode
packet events in real time. Buffer shows up to the in-memory limit.GET /api/packets/history. Useful for post-event analysis. Live capture pauses.BPF Filter Syntax
The filter bar supports a custom Berkeley Packet Filter (BPF)-style syntax. Multiple terms are ANDed together:
| Filter | Example | Effect |
|---|---|---|
type:X | type:Message | Show only packets of this app type |
src:X | src:!aabbccdd | Show packets from this sender |
dst:X | dst:^all | Show packets to this recipient |
snr>N | snr>-5 | SNR above threshold |
snr<N | snr<10 | SNR below threshold |
text:X | text:hello | Search decoded payload text |
ch:N | ch:0 | Channel index match |
Protocol Type Pills
Quick-filter buttons at the top filter by packet type: ALL / MESSAGE / POSITION / TELEMETRY / NODE_INFO / ROUTING. Each shows a live count of packets of that type in the current buffer.
Column Sorting
Click any column header to sort by that column. Click again to reverse. Columns: No., Time, Δt (delta from previous packet), Src, Dst, Ch, Protocol, SNR, Hops, Payload.
Detail Pane
Click any row to select it. The resizable detail pane at the bottom shows three columns:
- Raw JSON Object — the full packet object with syntax-highlighted JSON. Copy button in header.
- Decoded Metadata — key-value pairs: portnum, payload text, position fields, telemetry values, etc.
- Radio Layer — SNR, RSSI, hop limit, hop start, hops consumed, source detection result and confidence score.
The detail pane is resizable by dragging the sh-resizer bar between the table and pane.
Node Sidebar
Left sidebar lists all nodes that have emitted packets in the current buffer, ordered by packet count. Clicking a node filters the table to only show packets from that node. An SNR sparkline at the bottom shows the most recent 20 SNR readings from the selected node.
Traceroute
Sends a live traceroute request to a target node and visualises the path.
Running a Trace
- Enter a node ID in the
!xxxxxxxxformat, or click a node from the list below - Set the hop limit (1–7, default 5)
- Click TRACE ROUTE
The frontend calls POST /api/traceroute/run and waits up to 60 seconds. A status line shows Waiting for response… while in progress.
Result View
On success, the RESULT tab shows each hop with:
- Hop number and direction (→ towards target, ← back)
- Node ID and name (looked up from
meshState.nodes) - SNR per hop segment (from
snrTowards/snrBackarrays, divided by 4 for dB conversion) - Direct link indicator if no intermediate hops
- Final RSSI and SNR for the received response packet
Map Tab
If all nodes in the trace have GPS coordinates, the MAP tab shows the route plotted on a Leaflet map with colour-coded segments. If any node has no coordinates, a warning bar lists the missing nodes.
History
Previous traceroutes are loaded from GET /api/traceroutes and shown in the left panel history list. Clicking a history entry re-renders the result for that trace.
Node Comparison
Compare up to 4 nodes side-by-side with globally-linked Y-axes so charts are visually comparable.
Selecting Nodes
Click any of the four slot buttons (ALPHA / BETA / GAMMA / DELTA). A searchable dropdown appears — type to filter by name or node ID. Click a node to assign it. Click the ✕ on a filled slot to remove it.
Time Range
Buttons select the lookback window: 24H / 3D / 7D / 30D. On change, all data is re-fetched concurrently for all selected nodes.
Chart Layout
The grid is dynamically sized: if 2 nodes are selected, it's a 2-column grid; 3 nodes = 3 columns; 4 = 4. Each row is a different metric. Metrics rendered (if data exists): Battery, Voltage, SNR, RSSI, Channel Utilisation, Temperature, Altitude.
The Y-axis min/max is computed globally across all selected nodes for each metric, so the axes are linked. This means a battery chart in column A and column B share the same scale, making visual comparison meaningful.
Each node's series is colour-coded: green, cyan, amber, purple (the same colours as the slot buttons).
Data Sources
For each selected node, three parallel requests are made: /api/nodes/{id}/history/telemetry, /api/nodes/{id}/history/positions, and /api/nodes/{id}/history/packets.
Analytics
Historical charts for network-wide and per-node metrics over time.
The analytics view loads data from GET /api/metrics/averages for network-wide SNR/RSSI averages, and /api/nodes/{id}/history/telemetry for per-node views.
A time range selector lets you choose how far back to look. Charts are rendered with Chart.js time-series axes.
Network-Wide Charts
The top section shows average SNR and RSSI across all non-local nodes over time, from GET /api/metrics/averages. These averages are computed every 5 minutes by a background worker and stored in the average_metrics_history table. The chart gives a historical view of overall mesh RF quality trends.
Per-Node Telemetry Charts
Select a node from the sidebar to view its individual telemetry history. Available series: battery level, voltage, channel utilisation, air util TX, temperature, humidity, barometric pressure (if environment sensor present), and uptime (reboots show as drops to 0).
Time Range
A range picker selects 1h, 6h, 24h, 7d, or 30d lookback windows. Changing the range re-fetches and re-renders all charts. The fetch uses the start query parameter on the history endpoints.