
CoreScope
Monitoring / Management StableSelf-hosted MeshCore packet analyzer with MQTT ingest, live packet feeds, interactive maps, channel chat, packet tracing and per-node analytics.
- Maintainer
- Kpa-clawbot ↗
- Kind
- Monitoring & Management
- Maturity
- Stable
- Languages
- JavaScript Go
- Licensing
- Open source
- Latest version
- 3.9.2 · 2026-06-13
- License
- GPL-3.0-or-later
- Platforms
- Docker Linux Web
Capabilities
Interfaces
- ✓ Web
- ✓ API
- ✓ Headless
Connections
- ✓ MQTT
- ✓ HTTP
- ✓ WebSocket
Capabilities
- ✓ Monitoring
- ✓ Telemetry
- ✓ Packet analysis
- ✓ Mapping
Install
Releases
from GitHub · updated 2026-06-23v3.9.2 # Latest 1 month ago · 2026-06-13 04:48 UTC
Upgrade urgency: Recommended. Big batch of operator-felt wins.
Highlights
Accessibility (#1668 — M2/M3/M4/M5 merged; M6 in flight)
- Two-tier CSS palette with semantic tokens (
--palette-*→--color-*/--text-*); operators can now hot-swap theme palettes - WCAG AA color-contrast hits across all 22 audited routes — 443 baseline violations → 0 verified by the new axe CI gate (#1696)
- Typography pass: 14px body / 12px+500 chip floor across the entire chrome (#1679)
- Hash-cell analytics palette, badge contrast, /live VCR controls (#1681)
- Audio-lab BPM + Volume sliders now have aria-labels
MQTT observability
- Per-source MQTT status endpoint + Observers panel (#1682) — connected/disconnected/last-packet/error counters per broker
- Mobile-friendly: cards at ≤640px instead of squished table (#1698)
Cold-load + analytics correctness
- Packet-store cold-load actually loads the database now (#1691). Pre-fix: after restart, only 0.3% of DB rows were loaded into RAM, dashboards looked empty for hours. Root cause: hot-load filtered by
first_seen(immutable per hash) instead of effective recency. Newtransmissions.last_seendenormalized column + writer-side update fixes this end-to-end. - Analytics endpoint returns 503 Retry-After during warm-up (#1688) — operators no longer see post-restart partial slices
- Warm-up banner surfaces backfill state in the UI (#1683)
Firmware 1.16 sync
- Server-side decoder parity for extended ACK payloads (#1695)
- Customizer toggle to hide 1-byte path hops (collide ~8-way at 2k nodes) — #1689
Performance
/packetsinit parallelizes loadObservers + loadPackets (#1693) — first-row time dropped from 25-40s to <5s on slow links- Confidence rating weighted by hash mode (#1687) — 1-byte sightings carry less weight than 6-byte
CI / operability
- OpenAPI completeness gate (#1678 Phase 1)
- Release fast-path: re-tag :edge → :vX.Y.Z when SHA matches (#1680) — most patch releases now skip the 30min full pipeline rerun
- Staging disk monitor + cleanup cron (#1686)
- Slideover E2E flake-gate reduced 20× → 3×, root cause fixed in #1693
Container image
ghcr.io/kpa-clawbot/corescope:v3.9.2(multi-arch: amd64, arm64)Verification
- 22 routes × 2 themes × 2 viewports automated a11y gate (axe-core, #1696)
- All 19 PRs ran through the full polish chain (parallel reviewers + Kent Beck TDD gate)
- Cold-load fix verified by
transmissions.last_seentest fixture (#1691)
Operator upgrade (MikroTik)
/container add remote-image=ghcr.io/kpa-clawbot/corescope:v3.9.2 envlist=cs-env mounts=cs-data,cs-caddyfile interface=veth-corescope start-on-boot=yes name=corescope-prod-v392Acknowledgements
External contributors carry over from v3.9.1.
- Two-tier CSS palette with semantic tokens (
v3.9.1 # 1 month ago · 2026-06-12 06:41 UTC
Upgrade urgency: Recommended — v3.9.1 is what v3.9.0 should have been. v3.9.0's container image never published (Playwright flake gated Docker build). v3.9.1 includes everything in v3.9.0 plus:
- WCAG AA contrast pass — new two-tier CSS palette (raw
--palette-*→ semantic--color-*/--text-*); muted-text family bumped to ≥4.5:1 in both themes (most well above —--text-mutedon dark surface goes 3.5 → 11.58:1). Operator-reported unknown-repeater chip ("dark-blue text on dark-blue background") fixed (2.75:1 → 4.95:1). Closes #1671. Partial fix for #1668. (#1676, f0addfda) - Slideover test stability —
test-slideover-1056-e2e.jswas racing the packets virtual-scroll spacer; tightened selectors, bumped data-row wait to 20s. Cleared the day-of-release CI flakes. Fixes #1662. (#1663+followups, f06359d7)
Verification
Test plan:
workspace-meshcore/test-plans/v3.9.0-cdp-test-plan.md(93 tests, applies unchanged to v3.9.1). M1 a11y audit:workspace-meshcore/a11y-audit/reports/violations-summary.md(2,429 BLOCKER → estimated 85% cleared by M2).Acknowledgements
External contributors from v3.9.0 still apply: @efiten, @EldoonNemar. No new external PRs since v3.9.0.
- WCAG AA contrast pass — new two-tier CSS palette (raw
v3.9.0 # 1 month ago · 2026-06-12 02:55 UTC
Upgrade urgency: Medium — fixes the post-restart "relay timelines empty" regression, surfaces silent
/api/nodestruncation, and ships operator-controlled per-name hiding.257 commits since v3.8.3 (72 substantive + 185 auto-generated coverage bumps). Every bullet ends with a commit SHA —
git show <sha>to verify.Highlights
- Your relay timelines survive a restart. Before v3.9.0, every container restart left repeater nodes with empty hop histories until live traffic replayed enough adverts to re-attribute. Now the relay-hop index is rebuilt from
path_jsonduring cold load — per-relay timelines, hop counts, and route stats are intact the moment the server says it's ready. (#1643, 938153dd) /api/nodesstops silently truncating at 500 rows. The hard cap was hiding nodes from the map, analytics and packets pages on any mesh of meaningful size — without any warning. Now properly paginated across every consumer, with internal UI requests bypassing the per-page clamp. (#1607, 26105748; #1637, 9002b25b; #1589, 7421ead9)- Hide your own node from a public dashboard with a prefix rename. New
hiddenNamePrefixesconfig (default["🚫"]) drops matching nodes from/api/nodes*while keeping DB rows for analytics — same convention other MeshCore dashboards already follow, no DB surgery, no permanent loss of history. (#1655, 825b2648) - Observer Compare is finally discoverable. The compare page existed before but was a hidden URL trick; now there are three entry points (header CTA, sticky selector strip, observer-table multi-select) leading into a Tufte-grade compare view with state-preserving selection. (#1642, 531bc8ac; #1645, c93ae67e; #1647, 167af54e)
- Per-node Reach. New
/api/nodes/{pubkey}/reach+ UI surfaces directional link quality per neighbor — answers "is my link to X any good in both directions" without staring at a topology graph. (#1627, e2212f50)
What's New
Observer Compare
- Promote observer comparison to first-class: header CTA, sticky selector strip, observer-table multi-select. (#1642, 531bc8ac)
- Tufte-grade compare page with themed button vocabulary + state-preserving multi-select across navigations. (#1645, c93ae67e)
- Polish: tightened checkboxes, hierarchy, selector strip + mobile fixes. (#1647, 167af54e)
- Wire
TableSorton the observers table with numeric/time column types so the sort affordance actually sorts. (#1641, d72ab69f)
Reach & Nodes
- Per-node Reach page +
GET /api/nodes/{pubkey}/reach(directional link quality). (#1627, e2212f50) - Paginate
/api/nodesacross map/live/analytics/packets/area-map so the 500-row server cap stops silently truncating UIs. (#1607, 26105748; #1637, 9002b25b) - Sortable First Seen column on the Nodes table. (#1587, 7533b3b6)
- Firmware
repeat:on|offhint now excludes listener-only observers from the disambiguator. (#1624, a4776557) - Link RTC-reset warnings on node detail to the offending packet hashes. (#1590, 1a2b8c48)
Analytics
- Relay Airtime Share endpoint + dumbbell chart. (#1601, 3898688d)
- 5-minute rolling-baseline anomaly detection for Write Sources. (#1593, a26a412c)
- TRACE packets overlay per-hop SNR on the path graph. (#1622, e9aed641)
- Multi-byte prefix repeaters now show up in the 1-byte hash-usage matrix view. (#1591, 3df89241)
Live & Map
- Fullscreen toggle on the live map + controls collapsed by default. (#1572, d7bd9d57)
- Colorblind simulation overlay (Brettel/Vienot) with reset-to-Wong button. (#1600, 571c960c)
- Path symbols legend disclosure on packets. (#1570, 5fd8900c)
- OSM / Stamen tile providers with per-provider Leaflet layer control. (#1533, d7cd9203)
- Operator-configurable
liveMap.maxNodes(default 2000). (#1577, 1bdb92de)
Config & Operator Surfaces
hiddenNamePrefixes(default["🚫"]) — drop matching nodes from/api/nodes*while preserving DB rows. (#1655, 825b2648)- Config-driven disabled-tabs list in the customizer modal. (#1579, 7292d60f)
- `branding …
- Your relay timelines survive a restart. Before v3.9.0, every container restart left repeater nodes with empty hop histories until live traffic replayed enough adverts to re-attribute. Now the relay-hop index is rebuilt from
Project signals
- GitHub stars
- 149
- Forks
- 41
- Watchers
- 4
- Open issues
- 126
- Contributors
- 25
- Release downloads
- 43
- Latest downloads
- 0
- Source available
- Yes
- Releases available
- Yes
- Signed releases
- No
- CI builds
- Yes
- Documentation
- Yes
- Latest GitHub release has no binary assets; deployment is documented through the GHCR Docker image or source checkout.