Configuration Reference
All Muxit server settings live in workspace/config/server.json. You can edit this file directly or use the Settings panel in the web UI.
File Location
workspace/config/server.jsonChanges to this file require a server restart to take effect (except where noted).
Server
WebSocket
{
"websocket": {
"port": 8765
}
}| Field | Type | Default | Description |
|---|---|---|---|
websocket.port | int | 8765 | WebSocket server port. Also serves the web UI |
Override at startup: node start.js server --port=9000
Polling Rates
{
"polling": {
"connectorRate": 200,
"broadcastRate": 50,
"clientFlushRate": 100
}
}| Field | Type | Default | Unit | Description |
|---|---|---|---|---|
polling.connectorRate | int | 200 | ms | How often to poll connector properties |
polling.broadcastRate | int | 50 | ms | How often to batch state changes for WebSocket |
polling.clientFlushRate | int | 100 | ms | How often clients flush pending state updates |
Tuning tip: If you have many polled properties and see high CPU, increase connectorRate to 500 or 1000. The default 200ms (5 polls/second) is a good balance for most setups.
Logging
{
"logging": {
"level": "info"
}
}| Field | Type | Default | Description |
|---|---|---|---|
logging.level | string | "info" | Minimum log level: debug, info, warn, error |
Connectors
{
"connectors": {
"enabled": ["test-device", "webcam", "mqtt"]
}
}| Field | Type | Default | Description |
|---|---|---|---|
connectors.enabled | string[] | (auto) | List of enabled connector names. If absent, the first N connectors are auto-selected based on your license tier |
Connector names correspond to filenames in workspace/connectors/ (without .js). The TestDevice is always enabled regardless of this list.
Manage this from the Hardware panel — check/uncheck connectors and click Save.
Scripts
{
"scripts": {
"directory": "./scripts",
"autoStart": []
}
}| Field | Type | Default | Description |
|---|---|---|---|
scripts.directory | string | "./scripts" | Path to the scripts directory (relative to workspace) |
scripts.autoStart | string[] | [] | Script names to start automatically on server launch |
Auto-start example: "autoStart": ["monitor", "mqtt-connect"] runs these scripts when the server starts.
Drivers
{
"drivers": {
"directory": "./drivers"
}
}| Field | Type | Default | Description |
|---|---|---|---|
drivers.directory | string | "./drivers" | Path to the drivers directory (relative to workspace). Holds installed .muxdriver packages and (optionally) hand-dropped .driver.js files. Each .muxdriver is extracted on load into a hidden .cache/<id>@<version>/ inside this directory |
AI
{
"ai": {
"provider": "muxit",
"model": "anthropic/claude-haiku-4-5",
"maxTokens": 4096,
"instructions": "You are Muxit AI, an assistant for a hardware lab.",
"providers": {
"ollama": { "baseUrl": "http://localhost:11434/v1", "model": "llama3.2" },
"lmstudio": { "baseUrl": "http://localhost:1234/v1", "model": "auto" }
}
}
}| Field | Type | Default | Description |
|---|---|---|---|
ai.provider | string | "muxit" | LLM backend — "muxit" (cloud proxy), "ollama", "lmstudio", or "openai-compatible" |
ai.model | string | provider default | Active model id. Cloud uses OpenRouter ids (anthropic/claude-haiku-4-5); local providers use the loaded model name (llama3.2, auto) |
ai.maxTokens | int | 4096 | Max tokens per response |
ai.instructions | string | "" | Custom system prompt prepended to AI conversations |
ai.promptProfile | string | "standard" | "standard" ships full device schemas + decision-tree guidance in the system prompt; "minimal" strips both, leaving a one-line entry per device, and tells the model to call get_connector_schema(name) when it needs detail. Use "minimal" for local LLMs with 4–8K context windows. |
ai.favoriteModels | string[] | [] | Model IDs shown in the model picker (e.g., ["anthropic/claude-sonnet-4-5"]) |
ai.providers.<id>.baseUrl | string | per provider | Endpoint for local providers — http://localhost:11434/v1 for Ollama, http://localhost:1234/v1 for LM Studio |
ai.providers.<id>.apiKey | string | "" | Optional bearer token for openai-compatible endpoints |
ai.providers.<id>.model | string | per provider | Per-provider default model — used when the active provider is switched |
AI tool-call approval prompts are driven by the global safety level (see the Safety Guide), not by a separate ai config key.
The default Muxit AI cloud provider authenticates with your license key — no separate API keys needed. Local providers (Ollama, LM Studio, OpenAI-compatible) require a Pro license; once enabled they bypass the cloud entirely so chat, scripts, agents, and vision all run on your own hardware.
For detailed AI setup, see the AI & Voice Guide.
Voice
{
"voice": {
"stt": {
"provider": "browser",
"providers": {
"browser": {
"language": "en-US"
}
}
},
"tts": {
"enabled": false,
"provider": "browser",
"providers": {
"browser": {
"voice": "Google UK English Male",
"rate": 1.1,
"pitch": 0.9
}
}
},
"wakeWord": {
"enabled": false,
"word": "muxit",
"sensitivity": 0.5
},
"autoSend": true
}
}| Field | Type | Default | Description |
|---|---|---|---|
voice.stt.provider | string | "browser" | Speech-to-text provider (browser Web Speech API) |
voice.stt.providers.browser.language | string | "en-US" | STT language code |
voice.tts.enabled | boolean | false | Enable text-to-speech for AI responses |
voice.tts.providers.browser.voice | string | varies | TTS voice name (browser-dependent) |
voice.tts.providers.browser.rate | number | 1.0 | Speech rate (0.5–2.0) |
voice.tts.providers.browser.pitch | number | 1.0 | Speech pitch (0.5–2.0) |
voice.wakeWord.enabled | boolean | false | Enable "Muxit" wake word for hands-free activation |
voice.wakeWord.word | string | "muxit" | Wake word to listen for |
voice.wakeWord.sensitivity | number | 0.5 | Wake word detection sensitivity (0–1) |
voice.autoSend | boolean | true | Auto-send voice transcription when user pauses |
For detailed voice setup, see the AI & Voice Guide.
Security
{
"security": {
"editorMode": true,
"remoteAccess": false,
"https": false,
"bindAddress": "127.0.0.1"
}
}| Field | Type | Default | Description |
|---|---|---|---|
security.editorMode | boolean | true | Allow editing files from the web UI. Disable for read-only mode |
security.remoteAccess | boolean | false | Bind to all interfaces (0.0.0.0) for LAN access |
security.https | boolean | false | Enable HTTPS with auto-generated self-signed certificate |
security.bindAddress | string | "127.0.0.1" | Override bind address (advanced). Set to 0.0.0.0 for all interfaces |
Remote access password is stored separately in workspace/config/security.json (hashed, never plaintext).
For detailed remote access setup, see the Remote Access Guide.
Complete Example
Here's a fully annotated server.json:
{
"websocket": {
"port": 8765
},
"polling": {
"connectorRate": 200,
"broadcastRate": 50,
"clientFlushRate": 100
},
"logging": {
"level": "info"
},
"scripts": {
"directory": "./scripts",
"autoStart": []
},
"drivers": {
"directory": "./drivers"
},
"connectors": {
"enabled": ["test-device", "webcam"]
},
"ai": {
"provider": "muxit",
"model": "anthropic/claude-haiku-4-5",
"maxTokens": 4096,
"instructions": ""
},
"voice": {
"tts": { "enabled": false },
"wakeWord": { "enabled": false },
"autoSend": true
},
"security": {
"editorMode": true,
"bindAddress": "127.0.0.1"
}
}