mirror of
https://github.com/ajvpot/meshexplorer.git
synced 2026-06-29 06:10:56 +02:00
ad4f660c387ed91f79d2816111e1242edd2d2eb8
The MeshCore path_length byte encodes hop_count in its low 6 bits and a hash_size_code in its high 2 bits (0/1/2 -> 1/2/3 bytes per hop), and transport route types (TRANSPORT_FLOOD/TRANSPORT_DIRECT) insert a 4-byte transport_codes field between the header and path_length. The packet decoder previously assumed every hop was a single byte and that path_length always sat at byte 2, so it only handled 1-byte-hash, non-transport packets; anything else decoded to an over-long path and an empty payload. Migration 007 reworks the meshcore_packets read-time aliases to honor the transport_codes offset and compute the path as hop_count * hash_size bytes, and exposes hop_count / hash_size_code / hash_size (bytes per hop) as columns. payload, path and packet_hash now decode correctly for every route type and hash size; the adverts and public-channel derived tables are rebuilt from the corrected decode (invalid hash_size_code 3 packets are skipped per spec). hash_size is carried through the chat and advert APIs so the path visualization splits a path into hops of the correct width (pathUtils/PathVisualization), instead of always slicing one byte per hop. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MeshExplorer
A real-time map, chat client, and packet-analysis tool for MeshCore mesh
networks. This repository ships the whole stack so it can be brought up with a
single docker compose up:
| Component | Path | Description |
|---|---|---|
| Web app | meshexplorer/ |
Next.js UI + API (map, chat, stats, packet analysis) |
| Ingest + DB | ingest/ |
Go MeshCore MQTT→ClickHouse ingest, ClickHouse image, and SQL migrations |
| Discord relay | meshexplorer/ (Dockerfile.bot) |
Optional bot that relays MeshCore channel messages to Discord |
| Grafana | grafana/ |
Dashboards with a pre-provisioned ClickHouse datasource (read-only user), on 127.0.0.1:3000 |
Architecture
MQTT brokers (you configure)
│
▼
┌──────────────┐ ┌──────────────┐
│ meshcoreingest│──▶│ ClickHouse │◀── migrate (one-shot, applies schema)
└──────────────┘ └──────┬───────┘
│ (readonly user)
┌──────────┴──────────┐
▼ ▼ ▼
meshexplorer discord-bot grafana
(web UI :3001) (--profile bot) (:3000)
Quick start
Requirements: Docker + Docker Compose.
cp .env.example .env
# Edit .env — at minimum set:
# CLICKHOUSE_PASSWORD (read/write user, used by ingest + migrations)
# MQTT_BROKERS (JSON array of meshcore MQTT brokers to ingest from)
# Optional, for the Discord relay: DISCORD_WEBHOOK_URL (+ run with --profile bot)
docker compose up --build
Then open http://localhost:3001.
Startup order is handled automatically: ClickHouse becomes healthy → migrate
applies the schema and exits → meshcoreingest and meshexplorer start.
To also run the Discord relay:
docker compose --profile bot up --build
Configuration
All configuration is via environment variables in .env (see
.env.example for the full list and defaults). Highlights:
- ClickHouse — two accounts. The read/write
defaultuser (CLICKHOUSE_PASSWORD) is used by the ingest daemon and the migration runner; thereadonlyuser (CLICKHOUSE_READONLY_PASSWORD) is used by the web app and the Discord bot. ClickHouse is only published to127.0.0.1for debugging and is otherwise reachable only on the internalmeshnetnetwork. - MQTT_BROKERS — a JSON array; each entry is
{ "url", "username", "password", "topics" }(topicsdefaults to["meshcore/#"]). The ingest daemon exits with a clear error if this is unset, so configure at least one broker.
Development
Each component can be run on its own:
- Web app: see
meshexplorer/README.md(npm install && npm run dev). - Ingest: see
ingest/README.md(go build ./...).
Security notes
.envis gitignored — keep real credentials out of version control.- If you previously used the bundled defaults, rotate any secrets before going to production.
Description
Languages
TypeScript
83.6%
Go
10.1%
JavaScript
3.7%
CSS
1.6%
Dockerfile
0.8%
Other
0.2%