
Einseitiges Web-Dashboard für Meshtastic-Mesh-Netzwerke mit Live-Netzwerkkartierung, Paketanalyse, Chat, Sensortelemetrie und Topologievisualisierung. Läuft als Python-Dienst mit SQLite-gestützter Historie.
Meshyface ist ein Chat-zentriertes Meshtastic-Dashboard, das als einzelner Python-Dienst läuft und eine Single-Page-Web-UI über HTTP bereitstellt.
Die aktuelle UI bietet:
Der Konsolenarbeitsbereich ist eine terminalartige Steuerfläche für Paketverkehr, Verlaufssuche und Mesh-Dienstprogrammbefehle.
Tab oder Enter zum Annehmen, PfeilRechts zum Annehmen des ausgegrauten Suffixes und PfeilHoch / PfeilRunter zum Navigieren durch das Popup.! filtert nach Knoten-ID.live streamt Paketverkehr bis Strg+C oder q. Verwende live grep <text>, live rg <text>, live filter=<text> oder einfach live <text>, um nur passende Live-Paketgruppen zu streamen. Ebenen- und Ausführlichkeitsfilter gelten weiterhin, z.B. live rg TEXT_MESSAGE_APP -vv --layer=2.grep <text> und rg <text> durchsuchen den gespeicherten Paket-/Chat-Verlauf mit Kontextfenstern, Begrenzungen, Paket-/Chat-Quellfiltern und Zusammenfassungs-/Paketbereichsfiltern./search <text> filtert die sichtbare Konsolenausgabe von der Eingabeaufforderung, ohne eine gespeicherte Verlaufssuche zu starten.
Kartenansicht mit Knotenpositionen, Verbindungen, gemeinsamen Pfaden, Clustern und Signal-Wärmekarte.

Verlaufsansicht für Knotenanzahlen, Online-Status, neue Knoten und Positionsmeldungen.

Topologieansicht, die beobachtete Verbindungen vom ausgewählten Wurzelknoten zeigt.

Trace-Ansicht für eine Quelle, ein Ziel, nahegelegene Verbindungen und paketgenaue Details pro Hop.

Telemetriediagramm, das den Sensorverlauf über mehrere Knoten vergleicht.

Oberste Karten für Funkaktivität, Knotenanzahlen, Pakete, Verbindungen, Akku und Kanalnutzung.
Designs können das gesamte Dashboard mit benutzerdefinierten Farben, Farbverläufen, Transparenz, Unschärfe, Schriftarten, Partikeln oder einem Live-Karten-Hintergrund umgestalten. Diese Beispielpaletten sind benutzerdefinierte Designs; wähle eine Vorschau aus, um ihren Screenshot in voller Auflösung zu öffnen.
Meshyface-Knoten können kompakte Darstellungspakete teilen, die ein Knoten-Design-Rezept und einen optionalen Geist oder ein Wasserzeichen enthalten. Konfiguriere und zeige eine Vorschau deines Knotens unter Einstellungen > Darstellung > Knotendarstellung, aktiviere Knotendarstellung teilen und verwende dann Darstellung senden, um sie zu veröffentlichen.
flowchart LR
Browser["Browser<br/>single-page UI"]
CDN["Vendored browser assets<br/>Leaflet + leaflet.heat + particles.js"]
Tiles["Basemap provider<br/>OpenStreetMap tile service"]
Server["ThreadingHTTPServer<br/>HTML shell + JSON API"]
Assets["Python template assembly<br/>meshdash/html* + meshdash/assets/*"]
State["State loaders<br/>live snapshot + history readers"]
Services["Write services<br/>chat, settings, tools, games, optional files"]
Tracker["DashboardTracker<br/>live receive path + in-memory buffers"]
History["HistoryStore / SQLite (WAL)<br/>chat, packets, rollups, settings"]
Radio["Meshtastic interface<br/>serial or TCP"]
Mesh["Meshtastic radio / mesh"]
Atlas["Bundled offline atlas<br/>reference basemap fallback"]
Browser -->|GET /| Server
Browser -->|GET /api/*| Server
Browser -->|POST write APIs| Server
Browser --> CDN
Browser --> Tiles
Browser -->|fallback basemap data| Atlas
Server --> Assets
Server --> State
Server --> Services
State <--> Tracker
State <--> History
Services <--> History
Services <--> Radio
Radio <--> Mesh
Radio -->|receive callbacks| TrackerBeginne mit Voraussetzungen und Abhängigkeiten, wähle dann einen Installationspfad:
/opt/meshyface für einen persistenten, über GitHub aktualisierbaren Host./data für persistenten Zustand aus.--history-db ist der endgültige SQLite-Dateiname auf der Platte. Das Dashboard fügt kein Suffix mehr für das angeschlossene Funkgerät hinzu, sodass jedes am Dashboard angeschlossene Funkgerät zur selben gespeicherten Paket-, Chat-, Knoten- und Rollup-Verlauf beiträgt.
--no-history deaktiviert den persistenten Speicher und behält nur Live-Puffer im Arbeitsspeicher.mesh_dashboard_theme_settings.json oder der über --theme-settings-file angegebenen Datei gespeichert.Betriebsbefehle, die lokale Dashboard-Daten überprüfen oder reparieren, sind in docs/maintenance.md dokumentiert.
Die Verbindungen-Teilansicht ist eine Topologieansicht, keine Paketrouten-Wiedergabe.
Verlauf-Modus zeichnet aus der in SQLite gespeicherten Verbindungshistorie.Live-Modus zeichnet nur aus aktuellen Sitzungsverbindungsbeobachtungen.Der aktuelle Wurzelknoten ist der Knoten, um den der Graph zentriert ist. Das Auswählen eines anderen Knotens ändert die Wurzel und berechnet die nummerierten Entfernungsringe ausgehend von diesem Knoten neu.
--mesh-host <ip-or-dns>: TCP-Funk-Host--mesh-tcp-port <port>: TCP-Funk-Port, Standard 4403--mesh-port <path>: Seriellgerätepfad--default-gateway-host <host>: Fallback-TCP-Host, falls --mesh-host nicht angegeben ist und seriell noch auf dem Standardpfad liegt--default-gateway-port <port>: Fallback-TCP-Port für --default-gateway-host--no-default-gateway: Erzwinge seriell, es sei denn, --mesh-host ist explizit gesetztZugehörige Umgebungsvariablen:
MESH_GATEWAY_HOSTMESH_GATEWAY_PORTMESH_DASH_MESH_PORT für den Standard-Seriellpfad--http-host <host>: Bind-Host, Standard 0.0.0.0--http-port <port>: Bind-Port, Standard 8877--refresh-ms <ms>: Browser-Poll-Intervall, Standard 3000--packet-limit <n>: Puffergröße für kürzliche Live-Pakete, Standard 250--reset-ticker-scale-on-restart / --no-reset-ticker-scale-on-restart--show-secrets: Zeige private Schlüssel/Passwörter/PSKs in rohen JSON-Panels--debug-mode / --no-debug-mode: Lege nur für das Debugging bestimmte Dashboard-Oberflächen frei, z.B. erweiterte NetzwerkdiagnoseZugehörige Umgebungsvariablen:
MESH_DASH_PRIVATE_MODEMESH_DASH_API_TOKENMESH_DASH_GAMES_ENABLEMESH_DASH_VERSIONMESH_DASH_GIT_COMMITMESH_DASH_PR_NUMBERDie Laufzeitidentität stammt aus dem 12-stelligen Git-Commit, gefolgt von einer optionalen Pull-Request-Nummer, z.B. abc123456789 · PR #43. Das Software-Panel zeigt diese einzelne Revision anstelle einer Paketversion. GitHub-Merge/Squash-Commit-Betreffe werden automatisch erkannt; unmergeierte Vorschau-Bereitstellungen können MESH_DASH_PR_NUMBER explizit setzen.
/api/revision ist der kanonische Identitätsendpunkt. Seine Felder revision und build_ref melden die Laufzeitrevision, während commit und pr_number als strukturierte Felder verfügbar bleiben. /api/version bleibt als Legacy-Endpunkt erhalten, und sein Feld version behält Release-/Paket-Metadaten. MESH_DASH_VERSION ist ebenfalls für explizite Release-Paketierung reserviert und wird nicht im Dashboard angezeigt.
--file-transfer-enable: Aktiviere die Dateien-App; erfordert --accept-file-transfer-traffic-disclaimer--file-transfer-auto-accept: Akzeptiere eingehende Direktübertragungen ohne Browser-Bestätigung--file-transfer-max-bytes <bytes>: Limit pro Datei, Standard 65536 und begrenzt auf 1024-524288Übertragungen verwenden das Beta-Protokoll MF_FILE_V2 auf privatem Port 258 und sind nicht mit dem früheren Textnachrichten-Transport kompatibel. Wenn ein Ziel eine nutzbare erkannte Hop-Anzahl hat, verwendet Meshyface diese Anzahl plus eins, begrenzt durch das konfigurierte Funk-Hop-Limit. Hop-Daten, die älter als eine Stunde sind, fallen auf das konfigurierte Limit zurück. Die Dateien-App zeigt das ausgewählte Limit und seine Quelle an.
Zugehörige Umgebungsvariablen:
MESH_DASH_FILE_TRANSFER_ENABLEMESH_DASH_FILE_TRANSFER_AUTO_ACCEPTMESH_DASH_FILE_TRANSFER_MAX_BYTESMESH_DASH_ACCEPT_FILE_TRANSFER_TRAFFIC_DISCLAIMER--history-db <path>: Basis-SQLite-DB-Pfad--history-max-rows <n>: Standard 200000--history-retention-days <days>: Standard 30, verwende 0 zum Deaktivieren der Altersbereinigung--history-event-max-rows <n>: Append-only-Paketereignisgrenze, Standard 200000--history-event-retention-days <days>: Standard 30--history-rollup-retention-days <days>: Standard 365--no-history: Nur-Arbeitsspeicher-ModusZugehörige Umgebungsvariablen:
MESH_DASH_HISTORY_DB--theme-presets <json>: Optionale benutzerdefinierte Designvorlagendatei--theme-preset <name>: Ausgewählter Vorlagenname--theme-settings-file <json>: Persistente Laufzeit-DesignauswahldateiIntegrierte Vorlagen:
default (sicheres Meshyface-Blau, Partikel deaktiviert)custom (Showcase-Design mit Partikeln und Hintergrundeffekten aktiviert)Frische Installationen verwenden standardmäßig default, es sei denn, eine persistierte Designeinstellungsdatei oder MESH_DASH_THEME_PRESET wählt eine andere Vorlage aus.
Zugehörige Umgebungsvariablen:
MESH_DASH_THEME_PRESETSMESH_DASH_THEME_PRESETMESH_DASH_THEME_SETTINGS_FILE--private-mode und/oder einen API-Token für strengere Schreibpfadkontrolle.MESH_DASH_API_TOKEN gegenüber --api-token auf gemeinsam genutzten oder Mehrbenutzer-Hosts. Ein Befehlszeilen-Token kann in Prozesslisten sichtbar sein und in der Shell-Historie gespeichert bleiben.Join Meshyface-Kanalvorlage verwendet einen absichtlich öffentlich geteilten Meshyface-PSK für die Interoperabilität zwischen Benutzern dieser Software. Verwende diesen öffentlichen Kanal nicht für privaten Datenverkehr.--show-secrets legt sensible Werte in rohen JSON-Panels offen; aktiviere es nicht leichtfertig auf gemeinsam genutzten Bildschirmen.--no-allow-tokenless-raw-packet-download.Führe die normale Testsuite aus:
python -m pytest
Führe Ruff genauso aus wie CI:
scripts/run_ruff_local.sh
Führe den Advisory-App-Coverage-Bericht aus:
python -m pytest \
--cov=meshdash \
--cov=mesh_dashboard \
--cov=mesh_connection \
--cov-report=term
Führe das lokale Coverage-Gate mit dem strengeren Minimum von 85 % aus:
scripts/run_coverage_local.sh
Führe vor PRs den lokalen GUI-Reaktivitäts-Benchmark aus:
scripts/run_gui_responsiveness_local.sh
Coverage schließt das portierte Zork-Engine-Paket absichtlich von der Bewertung aus, aber eigenständige Zork- und Routing-Tests laufen weiter. GitHub Actions veröffentlicht denselben Coverage-Bericht als Advisory-PR-Kommentar und Artefakt. CI schlägt unter 80 % fehl. Das lokale Gate liegt 5 Prozentpunkte über dem CI-Wert.
![]() |
--private-mode / --no-private-mode: Entferne öffentliche Chat-Ausschnitte und blockiere ausgewählte öffentliche Endpunkte--api-token <token>: Erfordere Authentifizierung auf Schreibendpunkten über Authorization: Bearer <token> oder X-API-Token; bevorzuge MESH_DASH_API_TOKEN auf gemeinsam genutzten Hosts, da Befehlszeilen-Token in Prozesslisten und Shell-Historie sichtbar sein können--allow-tokenless-raw-packet-download / --no-allow-tokenless-raw-packet-download: Erlaube Raw-Packet-DB-Downloads ohne Token für Loopback/private-LAN-Clients; standardmäßig aktiviert--games-enable / --no-games-enable: Aktiviere spielbare eigenständige Zork-Konsolenendpunkte--seed-from-node-db: Starte den Live-Tracker aus der angeschlossenen Funk-NodeDB--backfill-environment-rollups: Baue Umgebungs-Rollups einmal neu auf und beende; siehe docs/maintenance.md--backfill-environment-rollups-reset: Lösche vorhandene Rollups vor dem Neuaufbau--node-history-hours <hours>: Standard-Zeitfenster für ausgewählten Knoten, Standard 72--node-history-max-points <n>: Maximale Punkte, die von /api/history/node zurückgegeben werden, Standard 1440