MeshDash Docs
R2.0
/
Home API Reference System & Config API

System & Config API

API Reference system config restart update version slot multi-radio settings api configuration
System management endpoints — config read/write, update check, restart, version status, and multi-radio slot management.

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)
If 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_MINUTES
  • LOG_LEVEL
  • MAX_PACKETS_MEMORY (resizes the packet deque live)
  • COMMUNITY_API_KEY
  • MESHTASTIC_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)
Display name. Default: "New Radio".
connection_type (str)
TCP | SERIAL | BLE. Default: TCP.
host (str)
IP address for TCP mode.
port (int)
TCP port. Default: 4403.
serial_port (str)
Device path for Serial mode.
ble_mac (str)
MAC address for BLE mode.
→ {"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.