
Meshtastic メッシュネットワーク向けのシングルページ Web ダッシュボード。ライブネットワークマッピング、パケット解析、チャット、センサーテレメトリ、トポロジー可視化を提供。Python サービスとして動作し、SQLite で履歴を保存します。
Meshyface は、単一の Python サービスとして動作し、HTTP 経由でシングルページの Web UI を提供する、チャットファーストの Meshtastic ダッシュボードです。
現在の UI は以下を提供します:
コンソールワークスペースは、パケットトラフィック、履歴検索、メッシュユーティリティコマンドのための端末スタイルの制御画面です。
Tab または Enter で確定、ArrowRight でゴーストされたサフィックスを受け入れ、ArrowUp / ArrowDown でポップアップ内を移動します。! はノードIDで絞り込みます。live は Ctrl+C または q までパケットトラフィックをストリーミングします。live grep <text>、live rg <text>、live filter=<text>、または単に live <text> を使用して、一致するライブパケットグループのみをストリーミングします。レイヤーと詳細度フィルターは引き続き適用されます。例: live rg TEXT_MESSAGE_APP -vv --layer=2grep <text> および rg <text> は、保持されたパケット/チャット履歴をコンテキストウィンドウ、制限、パケット/チャットソースフィルター、概要/パケットスコープフィルターで検索します。/search <text> は、プロンプトから表示中のコンソール出力をフィルタリングします(保持履歴検索は開始しません)。
ノードの位置、リンク、共通パス、クラスター、信号ヒートマップを含むマップビュー。

ノード数、オンラインステータス、新しいノード、位置報告の履歴ビュー。

選択したルートノードから観測されたリンクを示すトポロジビュー。

送信元、宛先、近隣リンク、ホップごとのパケット詳細のトレースビュー。

複数のノードにわたるセンサー履歴を比較するテレメトリーグラフ。

無線アクティビティ、ノード数、パケット、リンク、バッテリー、チャンネル使用状況のトップカード。
テーマは、カスタムカラー、グラデーション、透明度、ぼかし、フォント、パーティクル、またはライブマップ背景でダッシュボード全体を変形できます。以下のパレットはカスタムテーマの例です。任意のプレビューを選択すると、フル解像度のスクリーンショットが表示されます。
Meshyface ノードは、ノードテーマレシピとオプションのゴーストまたはウォーターマークを含むコンパクトな外観パケットを共有できます。Settings > Appearance > Node Appearance でノードを設定およびプレビューし、Share node appearance を有効にしてから Broadcast appearance を使用して公開します。
flowchart LR
Browser["ブラウザ<br/>シングルページUI"]
CDN["ベンダーブラウザアセット<br/>Leaflet + leaflet.heat + particles.js"]
Tiles["ベースマッププロバイダー<br/>OpenStreetMap タイルサービス"]
Server["ThreadingHTTPServer<br/>HTMLシェル + JSON API"]
Assets["Pythonテンプレートアセンブリ<br/>meshdash/html* + meshdash/assets/*"]
State["ステートローダー<br/>ライブスナップショット + 履歴リーダー"]
Services["書き込みサービス<br/>チャット、設定、ツール、ゲーム、オプションのファイル"]
Tracker["DashboardTracker<br/>ライブ受信パス + インメモリバッファ"]
History["HistoryStore / SQLite (WAL)<br/>チャット、パケット、ロールアップ、設定"]
Radio["Meshtastic インターフェース<br/>シリアルまたはTCP"]
Mesh["Meshtastic ラジオ / メッシュ"]
Atlas["バンドルされたオフライン地図帳<br/>参照ベースマップフォールバック"]
Browser -->|GET /| Server
Browser -->|GET /api/*| Server
Browser -->|POST 書き込みAPI| Server
Browser --> CDN
Browser --> Tiles
Browser -->|フォールバックベースマップデータ| Atlas
Server --> Assets
Server --> State
Server --> Services
State <--> Tracker
State <--> History
Services <--> History
Services <--> Radio
Radio <--> Mesh
Radio -->|受信コールバック| Tracker
前提条件と依存関係から始め、次にいずれかのインストールパスを選択します:
/opt/meshyface にクローンして、GitHub で更新可能な永続的なホストを設定します。/data を永続状態用にマウントします。--history-db は、ディスク上の最終的な SQLite ファイル名です。ダッシュボードは接続されたラジオのサフィックスを追加しなくなったため、ダッシュボードに接続された任意のラジオが同じ永続化されたパケット、チャット、ノード、ロールアップ履歴に貢献します。
--no-history は永続ストアを無効にし、ライブのインメモリバッファのみを保持します。mesh_dashboard_theme_settings.json に永続化されます。または --theme-settings-file で指定されたファイルに永続化されます。ローカルダッシュボードデータを検査または修復する運用コマンドは、docs/maintenance.md に文書化されています。
Links サブビューはトポロジビューであり、パケットルートの再生ではありません。
History モードは、SQLite に保存されたリンク履歴から描画します。Live モードは、現在のセッションのリンク観測のみから描画します。現在のルートは、グラフが中心となるノードです。別のノードを選択するとルートが変更され、そのノードからの番号付き距離リングが再計算されます。
--mesh-host <ip-or-dns>: TCP ラジオホスト--mesh-tcp-port <port>: TCP ラジオポート、デフォルト 4403--mesh-port <path>: シリアルデバイスパス--default-gateway-host <host>: --mesh-host が指定されておらず、シリアルが依然としてデフォルトパスにある場合のフォールバック TCP ホスト--default-gateway-port <port>: --default-gateway-host のフォールバック TCP ポート--no-default-gateway: --mesh-host が明示的に設定されない限り、シリアルを強制する関連する環境変数:
MESH_GATEWAY_HOSTMESH_GATEWAY_PORTMESH_DASH_MESH_PORT (デフォルトシリアルパス用)--http-host <host>: バインドホスト、デフォルト 0.0.0.0--http-port <port>: バインドポート、デフォルト 8877--refresh-ms <ms>: ブラウザポーリング間隔、デフォルト 3000--packet-limit <n>: 最近のライブパケットバッファサイズ、デフォルト 250--reset-ticker-scale-on-restart / --no-reset-ticker-scale-on-restart--show-secrets: raw JSON パネルで秘密鍵/パスワード/PSK を表示する--debug-mode / --no-debug-mode: 高度なネットワーク診断などのデバッグ専用ダッシュボード画面を公開する--private-mode / : 公開チャットスライスを削除し、選択された公開エンドポイントをブロックする関連する環境変数:
MESH_DASH_PRIVATE_MODEMESH_DASH_API_TOKENMESH_DASH_GAMES_ENABLEMESH_DASH_VERSIONMESH_DASH_GIT_COMMITMESH_DASH_PR_NUMBERランタイム識別情報は、12文字のgitコミットと、それに続くオプションのプルリクエスト番号で構成されます(例: abc123456789 · PR #43)。Softwareパネルは、パッケージバージョンの代わりにこの単一のリビジョンを表示します。GitHubのマージ/スカッシュコミットの件名は自動的に検出されます。マージされていないプレビューデプロイメントでは、MESH_DASH_PR_NUMBER を明示的に設定できます。
/api/revision は正規の識別エンドポイントです。その revision フィールドと build_ref フィールドはランタイムリビジョンを報告し、commit と pr_number は構造化フィールドとして引き続き利用可能です。/api/version はレガシーエンドポイントとして残り、その version フィールドはリリース/パッケージメタデータを保持します。MESH_DASH_VERSION も同様に明示的なリリースパッケージング用に予約されており、ダッシュボードには表示されません。
--file-transfer-enable: ファイルアプリを有効にする。--accept-file-transfer-traffic-disclaimer が必要--file-transfer-auto-accept: ブラウザでの確認なしに受信ダイレクト転送を自動承認する--file-transfer-max-bytes <bytes>: ファイルあたりの制限、デフォルト 65536、範囲は 1024-524288転送はベータ版の MF_FILE_V2 プロトコルをプライベートポート 258 で使用し、以前のテキストメッセージトランスポートとは互換性がありません。宛先に使用可能な検出ホップ数がある場合、Meshyface はその数に 1 を加えた値(設定されたラジオホップ制限で上限が決まる)を使用します。1 時間以上経過したホップデータは設定された制限にフォールバックします。Files アプリは選択された制限とそのソースを表示します。
関連する環境変数:
MESH_DASH_FILE_TRANSFER_ENABLEMESH_DASH_FILE_TRANSFER_AUTO_ACCEPTMESH_DASH_FILE_TRANSFER_MAX_BYTESMESH_DASH_ACCEPT_FILE_TRANSFER_TRAFFIC_DISCLAIMER--history-db <path>: ベースの SQLite DB パス--history-max-rows <n>: デフォルト 200000--history-retention-days <days>: デフォルト 30、0 を使用すると期間によるプルーニングを無効にする--history-event-max-rows <n>: 追記専用パケットイベントの上限、デフォルト 200000--history-event-retention-days <days>: デフォルト 30--history-rollup-retention-days <days>: デフォルト 365--no-history: メモリのみモード--seed-from-node-db: 接続されたラジオの NodeDB からライブトラッカーをブートストラップする関連する環境変数:
MESH_DASH_HISTORY_DB--theme-presets <json>: オプションのカスタムテーマプリセットファイル--theme-preset <name>: 選択されたプリセット名--theme-settings-file <json>: 永続化されたランタイムテーマ選択ファイル組み込みプリセット:
default (安全な Meshyface ブルー、パーティクル無効)custom (パーティクルと背景効果が有効なショーケーステーマ)新規インストールでは、永続化されたテーマ設定ファイルまたは MESH_DASH_THEME_PRESET が別のプリセットを選択しない限り、デフォルトで default になります。
関連する環境変数:
MESH_DASH_THEME_PRESETSMESH_DASH_THEME_PRESETMESH_DASH_THEME_SETTINGS_FILE--private-mode や API トークンを使用してください。--api-token よりも MESH_DASH_API_TOKEN を優先してください。コマンドラインのトークンはプロセス一覧に表示され、シェル履歴に残る可能性があります。Join Meshyface チャンネルプリセットは、このソフトウェアのユーザー間の相互運用性のために、意図的に公開共有の Meshyface PSK を使用します。プライベートトラフィックにはその公開チャンネルを使用しないでください。--show-secrets は raw JSON パネルで機密値を公開します。共有ディスプレイで軽率に有効にしないでください。--no-allow-tokenless-raw-packet-download を使用してください。通常のテストスイートを実行:
python -m pytest
Ruff を CI と同じ方法で実行:
scripts/run_ruff_local.sh
アドバイザリーアプリカバレッジレポートを実行:
python -m pytest \
--cov=meshdash \
--cov=mesh_dashboard \
--cov=mesh_connection \
--cov-report=term
より厳格な 85% 以上のローカルカバレッジゲートを実行:
scripts/run_coverage_local.sh
PR 前にローカル GUI 応答性ベンチマークを実行:
scripts/run_gui_responsiveness_local.sh
カバレッジは意図的に移植された Zork エンジンパッケージをスコアリングから除外しますが、スタンドアロンの Zork およびルーティングテストは引き続き実行されます。GitHub Actions は同じカバレッジレポートをアドバイザリー PR コメントおよびアーティファクトとして公開します。CI は 80% 未満で失敗します。ローカルゲートは CI より 5 パーセンテージポイント高いままです。
![]() |
--no-private-mode--api-token <token>: Authorization: Bearer <token> または X-API-Token による書き込みエンドポイントの認証を要求する。共有ホストではコマンドラインのトークンがプロセス一覧やシェル履歴に表示される可能性があるため、MESH_DASH_API_TOKEN を優先する--allow-tokenless-raw-packet-download / --no-allow-tokenless-raw-packet-download: ループバック/プライベートLANクライアントに対して、トークンなしでのrawパケットDBダウンロードを許可する。デフォルトで有効--games-enable / --no-games-enable: スタンドアロンでプレイ可能な Zork コンソールエンドポイントを有効にする--backfill-environment-rollups: 環境ロールアップを一度再構築して終了する。docs/maintenance.md を参照--backfill-environment-rollups-reset: 再構築前に既存のロールアップをクリアする--node-history-hours <hours>: デフォルトの選択ノードウィンドウ、デフォルト 72--node-history-max-points <n>: /api/history/node が返す最大ポイント数、デフォルト 1440