Configuration /config
Config file
All preferences are stored in ~/.config/muxd/config.json. You can edit this file directly or use /config set from the TUI.
JSON keys vs
/config setkeys: config.json usessnake_case(underscores), while/config setuses dot notation. For example,model_compactin config.json ismodel.compactin/config set. The two formats are interchangeable — use whichever you prefer.
Here's a comprehensive real-world example showing all the main fields:
{
"footer_tokens": true,
"footer_cost": true,
"footer_cwd": true,
"footer_session": true,
"footer_keybindings": true,
"model": "zai/glm-5.1",
"model_compact": "zai/glm-5.1",
"model_consult": "accounts/fireworks/models/kimi-k2p5",
"model_title": "accounts/fireworks/models/gpt-oss-120b",
"model_tags": "accounts/fireworks/models/gpt-oss-120b",
"provider": "zai",
"zai_api_key": "your-zai-key",
"zai_coding_plan": true,
"fireworks_api_key": "your-fireworks-key",
"brave_api_key": "your-brave-key",
"textbelt_api_key": "your-textbelt-key",
"scheduler_allowed_tools": "sms_send",
"daemon_auth_token": "your-daemon-token",
"hub_url": "http://192.168.1.50:4097",
"hub_node_token": "your-hub-token",
"hub_node_name": "my-desktop",
"tier1_percent": 0.65,
"tier3_percent": 0.85,
"tail_token_percent": 0.3,
"mobile_models": [
{ "id": "zai/glm-5.1", "display": "GLM 5.1", "provider": "Z.AI" },
{ "id": "accounts/fireworks/models/kimi-k2p5", "display": "Kimi k2p5", "provider": "Kimi" }
]
}
Only set the keys you need — omitted keys use defaults. The file is created automatically on first run.
/config Subcommands
| Command | Description |
|---|---|
/config show | Show all current preferences |
/config set <key> <value> | Set a preference |
/config reset | Reset all preferences to defaults |
/config daemon | Show daemon/network settings |
/config hub | Show hub settings |
/config mobile | Show mobile model picker settings |
/config models | Show available models and pricing |
/config node | Show node registration settings |
/config theme | Show theme settings |
/config tools | Show available tools |
/config set Keys
Daemon
| Key | JSON field | Description |
|---|---|---|
daemon.bind_address | daemon_bind_address | Network interface to bind (localhost, 0.0.0.0, or specific IP). Default: localhost |
daemon.auth_token | daemon_auth_token | Auth token for daemon connections (auto-generated on first start) |
Use 0.0.0.0 to make the daemon accessible from other devices on your LAN (e.g. the muxd mobile app):
/config set daemon.bind_address 0.0.0.0
Or via environment variable:
# Linux / macOS
export MUXD_BIND=0.0.0.0
muxd-daemon
# Windows (PowerShell)
$env:MUXD_BIND = "0.0.0.0"
muxd-daemon
Footer Display
| Key | JSON field | Type | Default | Description |
|---|---|---|---|---|
footer.cost | footer_cost | bool | true | Show estimated cost |
footer.cwd | footer_cwd | bool | true | Show current working directory |
footer.emoji | footer_emoji | string | (none) | Footer emoji (use /emoji picker or set by name) |
footer.keybindings | footer_keybindings | bool | true | Show keybinding hints |
footer.session | footer_session | bool | true | Show session info |
footer.tokens | footer_tokens | bool | true | Show token count |
show_diffs | hide_diffs | bool | true | Show inline file diffs (stored inverted as hide_diffs) |
Boolean values accept: true/false, on/off, yes/no, 1/0 (case-insensitive).
Preset emoji names: devil, imp, fire, rocket, skull, robot, ghost, alien, bolt, star, diamond, snake, cat, dog, heart. Use none to remove.
/config set footer.emoji devil
/config set footer.emoji none
Or use the interactive picker: /emoji
Theme
| Key | JSON field | Description |
|---|---|---|
theme.spinner | spinner_style | Activity spinner style used in the TUI status line and background-job indicator |
Set directly:
/config set theme.spinner mini-dot
Or use the interactive picker:
/spinner
Hub
Settings for running the hub coordinator (muxd-hub).
| Key | JSON field | Description |
|---|---|---|
hub.auth_token | hub_auth_token | Bearer token for hub authentication (auto-generated on first hub start) |
hub.bind_address | hub_bind_address | Hub bind address (default: localhost, use 0.0.0.0 for LAN access) |
Mobile
The iOS app has a model picker that fetches its list from the daemon via GET /api/mobile/config. By default it returns a built-in list of Claude and OpenAI models. Override it by adding a mobile_models array directly to ~/.config/muxd/config.json — this key cannot be set via /config set.
{
"mobile_models": [
{ "id": "zai/glm-5.1", "display": "GLM 5.1", "provider": "Z.AI" },
{ "id": "accounts/fireworks/models/kimi-k2p5", "display": "Kimi k2p5", "provider": "Kimi" },
{ "id": "claude-sonnet-4-6", "display": "Claude Sonnet 4.6", "provider": "Claude" },
{ "id": "gpt-4o", "display": "GPT-4o", "provider": "OpenAI" }
]
}
Each entry requires three fields:
| Field | Description |
|---|---|
id | Model ID sent to the API (e.g. zai/glm-5.1, accounts/fireworks/models/kimi-k2p5) |
display | Human-readable name shown in the iOS picker |
provider | Groups models under a section header in the picker (e.g. Z.AI, Kimi, Claude, OpenAI) |
View the current setting with /config mobile. When mobile_models is not set, the app uses the built-in default list.
Model
| Key | JSON field | Description |
|---|---|---|
model | model | Default model for all sessions |
model.compact | model_compact | Model used for smart compaction (defaults to model) |
model.consult | model_consult | Model used for /consult second opinion calls. No default. |
model.tags | model_tags | Model used for tagging (defaults to model) |
model.title | model_title | Model used for auto-titling sessions (defaults to model) |
All five accept full model IDs with or without provider prefix:
/config set model zai/glm-5.1
/config set model.compact zai/glm-5.1
/config set model.consult accounts/fireworks/models/kimi-k2p5
/config set model.title accounts/fireworks/models/gpt-oss-120b
/config set model.tags accounts/fireworks/models/gpt-oss-120b
Or set directly in config.json using the JSON field names.
Node
Settings for registering a daemon as a node with an existing hub.
| Key | JSON field | Description |
|---|---|---|
hub.node_name | hub_node_name | Display name for this node in the hub (defaults to hostname) |
hub.node_token | hub_node_token | Token this daemon uses to authenticate with the hub (same as the hub's hub.auth_token) |
hub.url | hub_url | Hub URL that this daemon registers with (e.g. http://hub-host:4097) |
See the Hub setup guide for the full connection flow.
Providers
Set API keys via /config set or environment variables. Resolution order: environment variable > /config set.
| Key | JSON field | Env var | Description |
|---|---|---|---|
anthropic.api_key | anthropic_api_key | ANTHROPIC_API_KEY | Anthropic API key |
brave.api_key | brave_api_key | BRAVE_SEARCH_API_KEY | Brave Search API key (for web search tool) |
deepinfra.api_key | deepinfra_api_key | DEEPINFRA_API_KEY | DeepInfra API key |
fireworks.api_key | fireworks_api_key | FIREWORKS_API_KEY | Fireworks AI API key |
google.api_key | google_api_key | GOOGLE_API_KEY | Google AI API key |
grok.api_key | grok_api_key | GROK_API_KEY | Grok / xAI API key |
mistral.api_key | mistral_api_key | MISTRAL_API_KEY | Mistral API key |
ollama.url | ollama_url | OLLAMA_URL | Ollama server URL (default: http://localhost:11434) |
openai.api_key | openai_api_key | OPENAI_API_KEY | OpenAI API key |
textbelt.api_key | textbelt_api_key | — | Textbelt API key (for SMS tools) |
zai.api_key | zai_api_key | ZAI_API_KEY | Z.AI API key |
zai.coding_plan | zai_coding_plan | — | Enable Z.AI coding plan mode (bool) |
Or use environment variables directly:
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENAI_API_KEY="sk-..."
export MISTRAL_API_KEY="..."
export GROK_API_KEY="xai-..."
export ZAI_API_KEY="..."
export GOOGLE_API_KEY="..."
export FIREWORKS_API_KEY="..."
export DEEPINFRA_API_KEY="..."
export OLLAMA_URL="http://localhost:11434"
Scheduler
| Key | JSON field | Description |
|---|---|---|
scheduler.allowed_tools | scheduler_allowed_tools | Comma-separated list of tools the scheduler may run |
Note: Scheduled agent tasks (created via
schedule_taskor/schedule add-task) bypass thescheduler.allowed_toolsallowlist. The spawned agent enforces its own tool policy at runtime.
SMS
| Key | JSON field | Description |
|---|---|---|
textbelt.api_key | textbelt_api_key | Textbelt API key for sending SMS |
/config set textbelt.api_key your-api-key
Get an API key at textbelt.com. Enables the sms_send, sms_status, and sms_schedule tools.
Tools
| Key | JSON field | Description |
|---|---|---|
tools.ask_user | tools_ask_user | Enable/disable the ask_user tool (default: true) |
tools.disabled | tools_disabled | Comma-separated list of tools to disable (e.g. bash,file_write) |
permissions.mode | permissions_mode | Tool approval mode: ask, accept-edits, or full-auto |
Boolean values accept: true/false, on/off, yes/no, 1/0 (case-insensitive).
Permission modes:
ask: prompt before bash and file edits (default)accept-edits: auto-approve in-project file edits, still ask for bashfull-auto: auto-approve most actions, but still blocks sensitive paths
/permissions ask
/permissions accept-edits
/permissions full-auto
Model Aliases
Use short aliases instead of full model IDs:
| Alias | Resolves to |
|---|---|
claude-haiku | claude-haiku-4-5-20251001 |
claude-opus | claude-opus-4-6 |
claude-sonnet | claude-sonnet-4-6 |
The anthropic/ prefix is optional: anthropic/claude-sonnet and claude-sonnet are equivalent.
/config set model claude-opus
Provider Prefixes
Use provider/model syntax to specify a model from any provider:
| Prefix | Provider | Example |
|---|---|---|
anthropic/ | Anthropic | anthropic/claude-sonnet-4-6 |
deepinfra/ | DeepInfra | deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct |
fireworks/ | Fireworks AI | fireworks/kimi-k2p5 |
google/ | Google AI | google/gemini-2.0-flash |
grok/ or xai/ | Grok / xAI | grok/grok-3 |
mistral/ | Mistral | mistral/mistral-large-latest |
ollama/ | Ollama (local) | ollama/llama3.3 |
openai/ | OpenAI | openai/gpt-4o |
zai/, zai-sdk/, or zhipu/ | Z.AI | zai/glm-5.1 |
The fireworks/ prefix is shorthand — the provider automatically prepends accounts/fireworks/models/. Both fireworks/kimi-k2p5 and accounts/fireworks/models/kimi-k2p5 work.
Auto-Detection
When no prefix is given, muxd detects the provider from the model name:
| Pattern | Detected provider |
|---|---|
accounts/fireworks/models/* | Fireworks AI |
autoglm-*, glm-* | Z.AI |
claude-* | Anthropic |
codestral-*, ministral-*, mistral-*, pixtral-* | Mistral |
gpt-*, o1*, o3*, o4* | OpenAI |
grok-* | Grok / xAI |
Contains : (e.g. gemma3:4b) | Ollama |
Provider Model Examples
/config set model claude-sonnet # Anthropic (alias)
/config set model gpt-4o # OpenAI (auto-detected)
/config set model mistral-large-latest # Mistral (auto-detected)
/config set model grok-3 # Grok / xAI (auto-detected)
/config set model zai/glm-5.1 # Z.AI (prefix)
/config set model fireworks/kimi-k2p5 # Fireworks (prefix)
/config set model accounts/fireworks/models/kimi-k2p5 # Fireworks (full path)
/config set model deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct # DeepInfra (prefix)
/config set model google/gemini-2.0-flash # Google (prefix)
/config set model llama3.3:latest # Ollama (auto-detected by ":")
Pricing
muxd tracks estimated costs per session.
Built-in pricing
| Model | Input ($/1M tokens) | Output ($/1M tokens) |
|---|---|---|
claude-haiku-4-5-20251001 | $1.00 | $5.00 |
claude-opus-4-6 | $5.00 | $25.00 |
claude-sonnet-4-6 | $3.00 | $15.00 |
Custom pricing
Override or add pricing in ~/.config/muxd/pricing.json:
{
"my-custom-model": {
"input": 1.0,
"output": 5.0
}
}
Values are dollars per million tokens. Custom entries merge with defaults.
Data Directory
| Path | Contents |
|---|---|
~/.config/muxd/config.json | User preferences and API keys |
~/.config/muxd/pricing.json | Custom pricing overrides |
~/.local/share/muxd/muxd.db | SQLite database (sessions and messages) |