neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Self-hosted, multi-protocol web dashboard for Meshtastic, MeshCore, and MQTT mesh networks. Real-time maps, messaging, telemetry, automation, and alerts. Runs on Docker, desktop, or Kubernetes.
Developer toolsTypeScript · CSSGitHub @YerazeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Web tool for monitoring Mesh Node Deployment over TCP/HTTP
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A comprehensive web application for monitoring off-grid mesh networks — Meshtastic, MeshCore, and MQTT — from a single dashboard. Built with React, TypeScript, and Node.js, featuring a beautiful Catppuccin Mocha dark theme and multi-database support (SQLite, PostgreSQL, MySQL).
• Getting Started Guide - Installation and quick start
• FAQ - Frequently asked questions and troubleshooting
• Configuration - Detailed configuration options
• Development - Contributing and development setupRead the full README ↗A comprehensive web application for monitoring off-grid mesh networks — Meshtastic, MeshCore, and MQTT — from a single dashboard. Built with React, TypeScript, and Node.js, featuring a beautiful Catppuccin Mocha dark theme and multi-database support (SQLite, PostgreSQL, MySQL).
For complete documentation, visit meshmonitor.org
Get MeshMonitor running in 60 seconds:
# 1. Create docker-compose.yml
cat > docker-compose.yml << 'EOF'
services:
meshmonitor:
image: ghcr.io/yeraze/meshmonitor:latest
ports:
- "8080:3001"
volumes:
- meshmonitor-data:/data
environment:
- MESHTASTIC_NODE_IP=192.168.1.100 # Seeds the first source on first boot; manage more from Dashboard → Sources
restart: unless-stopped
volumes:
meshmonitor-data:
EOF
# 2. Start MeshMonitor
docker compose up -d
# 3. Open http://localhost:8080
Default login: admin / changeme (change after first login!)
For detailed installation instructions, configuration options, and deployment scenarios, see the Getting Started Guide.
Running on Kubernetes? Add the MeshMonitor Helm repository and install — no checkout required:
helm repo add meshmonitor https://meshmonitor.org/charts
helm repo update
# Minimal custom-values.yaml
cat > custom-values.yaml << 'EOF'
env:
meshtasticNodeIp: "192.168.1.100"
meshtasticUseTls: "false"
EOF
helm install meshmonitor meshmonitor/meshmonitor -f custom-values.yaml
Prefer to install from a local checkout instead?
helm install meshmonitor ./helm/meshmonitor -f custom-values.yamlstill works againsthelm/meshmonitor/.
See the Helm Chart README for ingress, TLS, persistence, and the full values reference, or the Helm Deployment Guide on the docs site.
MeshMonitor supports authentication via reverse proxy headers for seamless single sign-on (SSO) integration with Cloudflare Access, oauth2-proxy, Authelia, Traefik ForwardAuth, and similar solutions.
services:
meshmonitor:
image: ghcr.io/yeraze/meshmonitor:latest
environment:
# Enable proxy authentication
- PROXY_AUTH_ENABLED=true
- PROXY_AUTH_AUTO_PROVISION=true
# Admin detection
- PROXY_AUTH_ADMIN_GROUPS=admins,mesh-admins
- [email protected]
# Required: Trust the reverse proxy
- TRUST_PROXY=1
# Optional: Logout redirect
- PROXY_AUTH_LOGOUT_URL=https://auth.example.com/oauth2/sign_out
⚠️ IMPORTANT: Proxy authentication requires:
TRUST_PROXY is configured to trust your reverse proxyAs of v4.13, TRUST_PROXY defaults to false; you MUST set TRUST_PROXY=1 (or the appropriate hop count/subnet) whenever MeshMonitor runs behind any reverse proxy, or client IP resolution, rate limiting, and audit logs will all show the proxy's IP.
⚠️ Email uniqueness is NOT enforced in the database schema. If multiple users share the same email address, the first match will be used. Ensure your proxy provides unique email addresses for each user.
# Core settings
PROXY_AUTH_ENABLED=false # Enable proxy auth (default: false)
PROXY_AUTH_AUTO_PROVISION=false # Auto-create users (default: false)
# Admin detection (at least one recommended)
PROXY_AUTH_ADMIN_GROUPS= # Comma-separated admin groups (case-insensitive match)
PROXY_AUTH_ADMIN_EMAILS= # Comma-separated admin emails (case-insensitive match)
# Normal-user group gate (optional, see below)
PROXY_AUTH_NORMAL_USER_GROUPS= # Comma-separated groups allowed to access (empty = all allowed)
# JWT configuration (for Cloudflare Access)
PROXY_AUTH_JWT_GROUPS_CLAIM=groups # Groups claim path (supports Auth0 custom namespaces)
# Custom headers (optional, for non-standard proxies)
PROXY_AUTH_HEADER_EMAIL= # Custom email header name
PROXY_AUTH_HEADER_GROUPS= # Custom groups header name
# Logout
PROXY_AUTH_LOGOUT_URL= # Redirect URL after logout
# Audit logging
PROXY_AUTH_AUDIT_LOGGING=true # Log auth events (default: true)
Cloudflare Access application JWTs contain a subset of the full identity — typically email, aud, iss, sub. Custom OIDC claims (e.g. Auth0 role claims) are only present when the IdP integration is configured to include them. If your PROXY_AUTH_JWT_GROUPS_CLAIM (e.g. https://your-domain/roles) is missing from the Cf-Access-Jwt-Assertion header, MeshMonitor will see empty groups and group-based admin will never trigger.
To verify: Decode a real request JWT at jwt.io using the Cf-Access-Jwt-Assertion header from browser DevTools, and confirm the groups claim exists and its shape. Cloudflare often places IdP custom claims under a custom object (e.g. custom["https://your-domain/roles"]); official examples may show a flatter layout — your decoded token is the ground truth for your tenant.
Fallback: Set PROXY_AUTH_ADMIN_EMAILS to an operator email allowlist. MeshMonitor matches emails case-insensitively, so admin works even when the app JWT omits custom IdP claims.
See: Cloudflare Application Token
MeshMonitor normalizes groups claims from the JWT to handle different IdP formats:
["admin", "user"]) — used as-is"admin") — wrapped into an array[{ "name": "admin" }, { "name": "user" }]) — .name is extractedThis handles Auth0 Post-Login Actions that emit role objects instead of plain strings. All group matching (admin groups, normal-user groups) is case-insensitive.
PROXY_AUTH_NORMAL_USER_GROUPS adds an application-layer group check as a second gate, on top of the reverse proxy's URL-level access control.
Two-layer model:
When configured, only users whose groups contain at least one value from this list (or who are admins) are allowed. Users who passed the proxy but lack a matching group receive 403 FORBIDDEN_PROXY_GROUP.
When empty (default), all proxy-authenticated users are allowed — the reverse proxy is the only gate.
Cloudflare Access + Auth0 (with normal-user gate):
PROXY_AUTH_ENABLED=true
PROXY_AUTH_AUTO_PROVISION=true
PROXY_AUTH_JWT_GROUPS_CLAIM=https://mydomain.com/roles
PROXY_AUTH_ADMIN_GROUPS=admins
PROXY_AUTH_NORMAL_USER_GROUPS=meshmonitor-users
[email protected]
PROXY_AUTH_LOGOUT_URL=https://yourteam.cloudflareaccess.com/cdn-cgi/access/logout
TRUST_PROXY=1
COOKIE_SECURE=true
oauth2-proxy:
PROXY_AUTH_ENABLED=true
PROXY_AUTH_AUTO_PROVISION=true
[email protected],[email protected]
PROXY_AUTH_LOGOUT_URL=https://auth.example.com/oauth2/sign_out
TRUST_PROXY=1
When proxy authentication is enabled, existing local users are automatically migrated on first login if their email matches:
authMethod updated to 'proxy'⚠️ Migration is irreversible without admin intervention. Migrated users cannot revert to local authentication without a password reset.
MeshMonitor supports multiple deployment methods:
🐳 Docker (Recommended) - Pre-built multi-architecture images with auto-upgrade support
☸️ Kubernetes / Helm - Helm chart for production clusters
📦 Proxmox LXC - Lightweight containers for Proxmox VE
🔧 Manual - Direct Node.js deployment (bare metal)
/data/meshmonitor.db (Docker convention). Bare-metal installs must set DATABASE_PATH to a writable location or create /data/ for the runtime user.🖥️ Desktop Apps - Native applications for Windows and macOS
/reports; first report is Solar Monitoring Analysis with auto-detection of solar-powered nodes, production overlay, healthy-level reference lines, and multi-day battery forecast simulationFor a complete feature list and technical details, visit meshmonitor.org.
# Clone with submodules
git clone --recurse-submodules https://github.com/Yeraze/meshmonitor.git
cd meshmonitor
# Install dependencies
npm install
# Configure environment
cp .env.example .env
# Edit .env to seed the first source (MESHTASTIC_NODE_IP / MESHTASTIC_TCP_PORT); additional nodes are added later via Dashboard → Sources
# Start development servers
npm run dev:full
This starts both the React dev server (port 5173) and the Express API server (port 3001).
Development:
npm run dev - Start React development servernpm run dev:server - Start Express API servernpm run dev:full - Start both development serversnpm run build - Build React app for productionnpm run build:server - Build Express server for productionTesting & Quality:
npm run test - Run tests in watch modenpm run test:run - Run all tests oncenpm run test:coverage - Generate coverage reportnpm run lint - Run ESLintnpm run typecheck - Run TypeScript compiler checksFrontend:
Backend:
DevOps:
We welcome contributions! Please see our Contributing Guide for details on:
Quick start:
git checkout -b feature/amazing-feature)npm run test:run)feat: add amazing feature)This project is licensed under the BSD-3-Clause License - see the LICENSE file for details.
MeshMonitor - Monitor your mesh, beautifully. 🌐✨
This application is brought to you with help from Claude Code.