System & Config API
System endpoints manage the MeshDash application itself — reading and writing the config file, triggering updates, restarting the service, and managing multiple radio connections (slots).
Version Status
GET /api/system/version-status
Checks the remote update server for the latest available version and compares against the running version.
notify (bool, optional)true, pushes an SSE system_update message to all connected clients with the result. Default: false.GET /api/system/version-status
{
"local": "R2.2.3.1",
"remote": "R2.2.4.0",
"status": "update_needed"
}
Possible status values: current, update_needed, beta.
POST /api/system/check-update — Auth Required
Performs a version check with notify=true (sends SSE message) and returns the result.
POST /api/system/check-update
→ {
"status": "update_available",
"local": "R2.2.3.1",
"remote": "R2.2.4.0",
"message": "Update available: vR2.2.4.0"
}
POST /api/system/start-update — Auth Required
Downloads the latest version as update.zip, stages it with a .update_ready flag, then restarts the process. The boot-time updater applies the update on next start.
POST /api/system/start-update
→ {
"status": "success",
"target_version": "R2.2.4.0",
"message": "Downloaded R2.2.4.0. MeshDash is restarting to apply changes..."
}
The response is delivered just before the process exits. The service manager (systemd) will restart the process automatically.
Restart
POST /api/system/restart — Auth Required
Broadcasts a restart notice over SSE, disconnects the radio gracefully, then hot-swaps the process with os.execv().
POST /api/system/restart
→ (no response — process restarts)
Configuration
GET /api/system/config — Auth Required
Reads the current .mesh-dash_config file and returns all keys as a JSON object. Response is never cached.
GET /api/system/config
→ {
"MESHTASTIC_CONNECTION_TYPE": "SERIAL",
"MESHTASTIC_SERIAL_PORT": "/dev/ttyACM0",
"WEBSERVER_PORT": "8000",
...
}
POST /api/system/config/update — Auth Required
Updates one or more config keys, writes the file, and hot-reloads applicable globals without a restart.
POST /api/system/config/update
Content-Type: application/json
{
"LOG_LEVEL": "DEBUG",
"MAX_PACKETS_MEMORY": 500,
"HISTORY_DAYS": 30
}
All fields in ConfigUpdateRequest are optional. Only include the keys you want to change.
→ {
"status": "success",
"message": "Configuration saved. Some changes require a server restart.",
"updated_keys": ["LOG_LEVEL", "MAX_PACKETS_MEMORY", "HISTORY_DAYS"]
}
Keys that take effect immediately (no restart needed):
AUTH_SECRET_KEY,AUTH_TOKEN_EXPIRE_MINUTESLOG_LEVELMAX_PACKETS_MEMORY(resizes the packet deque live)COMMUNITY_API_KEYMESHTASTIC_HOST,MESHTASTIC_PORT
Keys that require a restart: WEBSERVER_PORT, DB_PATH, TASK_DB_PATH, any scheduler or C2 interval settings.
POST /api/system/config/initial-setup
One-time setup endpoint. See Authentication — Initial Setup for full documentation.
Plugin System
See the full Plugin API reference for all plugin management endpoints.
Multi-Radio Slot Management
MeshDash supports connecting multiple Meshtastic radios simultaneously. Each radio occupies a slot. The primary slot is always node_0 and cannot be removed. Up to 16 additional slots can be created.
GET /api/slots — Auth Required
Returns all active slots with their current status.
GET /api/slots
→ {
"node_0": {
"slot_id": "node_0",
"label": "Primary Radio",
"connection_status": "Connected",
"is_ready": true,
"local_node_id": "!aabbccdd",
"node_count": 8,
"packets_session": 1420
}
}
POST /api/slots — Auth Required
Creates a new radio slot and immediately begins the connection loop.
POST /api/slots
Content-Type: application/json
{
"label": "Remote Radio",
"connection_type": "TCP",
"host": "192.168.1.55",
"port": 4403
}
label (str)"New Radio".connection_type (str)TCP | SERIAL | BLE. Default: TCP.host (str)port (int)4403.serial_port (str)ble_mac (str)→ {"status": "created", "slot_id": "node_1", "label": "Remote Radio"}
GET /api/slots/{slot_id}/status — Auth Required
Full status for a specific slot including node info and session stats.
DELETE /api/slots/{slot_id} — Auth Required
Cancels all tasks for the slot, shuts down its connection manager, and removes it from the registry. Cannot remove node_0.
DELETE /api/slots/node_1
→ {"status": "removed", "slot_id": "node_1"}
SSE per Slot
Each slot has its own SSE stream. Connect to /sse/node_1 for slot-specific events.