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). Contains .driver.js files and free//premium/ DLL subdirectories |
AI
{
"ai": {
"provider": "openrouter",
"providers": {
"openrouter": {
"apiKey": "sk-or-v1-YOUR-KEY",
"model": "anthropic/claude-sonnet-4",
"maxTokens": 4096
},
"claude": {
"apiKey": "",
"model": "claude-sonnet-4-20250514",
"maxTokens": 4096
},
"openai": {
"apiKey": "",
"model": "gpt-4o",
"maxTokens": 4096
},
"google": {
"apiKey": "",
"model": "gemini-2.0-flash",
"maxTokens": 4096
}
},
"safetyMode": "confirm",
"instructions": "You are Muxit AI, an assistant for a hardware lab."
}
}| Field | Type | Default | Description |
|---|---|---|---|
ai.provider | string | "openrouter" | Active LLM provider name |
ai.providers.<name>.apiKey | string | "" | API key for the provider |
ai.providers.<name>.model | string | varies | Model identifier |
ai.providers.<name>.maxTokens | int | 4096 | Max tokens per response |
ai.safetyMode | string | "confirm" | "confirm" = approve each tool call; "trust" = auto-execute |
ai.instructions | string | "" | Custom system prompt prepended to AI conversations |
Providers: Configure multiple providers and switch between them by changing ai.provider. Each provider has its own API key and model settings.
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": "openrouter",
"providers": {
"openrouter": {
"apiKey": "sk-or-v1-YOUR-KEY",
"model": "anthropic/claude-sonnet-4",
"maxTokens": 4096
}
},
"safetyMode": "confirm",
"instructions": ""
},
"voice": {
"tts": { "enabled": false },
"wakeWord": { "enabled": false },
"autoSend": true
},
"security": {
"editorMode": true,
"bindAddress": "127.0.0.1"
}
}