FIRST-RUN SETUP

Product Modules opt-in features

You just installed muLLM. Welcome — you're setting it up for the first time. Below are the optional capability layers that extend the core router. You don't need any of these to start chatting. Read each one carefully and only enable what you'll actually use — each module installs dependencies and changes the interface. You can always come back and change this later.

Loading module manifest...

1. Local Model (Ollama)

muLLM routes most queries to your local GPU for free. Ollama manages local models.

Ollama
Local models — free, private, runs on your GPU
checking...
No API key needed! Ollama runs locally. Install from ollama.ai, then run:
ollama pull qwen3:8b (general model, ~5GB)
Optional embeddings: ollama pull nomic-embed-text
The DeBERTa classifier is a Python model, not an Ollama model. Works with as little as 6-8GB VRAM.

1.5. Local Backend Profiles optional

Beginners can skip this. Advanced users can expose experimental and nightly profiles for llama.cpp, TabbyAPI, ExLlamaV3, MTP, and large-context coding comparisons.

Researcher backend mode Show the advanced local backend stack. Expand to tune nightly and experimental pieces individually.
Experimental backend configs Show Qwen3.6 dense, TabbyAPI/ExLlamaV3, vLLM-style and other research configs.
Nightly / main-branch configs Expose CUDA nightly, llama.cpp main/fork MTP flags, and other unstable researcher paths.
Backend profile list
Loading backend profiles...
Profiles are intentionally advisory today: they show env vars and commands without mutating your model setup. That keeps beginner install painless while making research configs reproducible.

1.6. Languages English always on

Enable additional language packs for chat input/output, translation memory, speech input, and TTS. English remains the routing fallback and cannot be disabled.

Loading language options...
If a direct pair is unavailable, muLLM falls back through English and clearly reports the model/tier used. Local MarianMT packs are installed separately with mullm1-language-pack.

1.7. Studio Assets configurable storage

Generated GLB, audio, image, and sidecar metadata files are saved under the asset root. Use a large local disk, mounted NAS/NFS path, or external drive for big generation runs.

Backendlocal
3D assets0
Resolved rootnot loaded
Today this writes [studio.assets] root in mullm.toml. The storage layer already has room for local, s3, azure_blob, and external API backends; Perforce, Git LFS, and NFS can sit behind the same asset root or backend interface later.

2. Cloud APIs (Optional) local secret storage

Cloud models handle complex queries. You only pay for what muLLM can't handle locally (~15% of queries).

muLLM uses the OS keychain when available, then falls back to .env.
Anthropic (Claude)
Best for reasoning, code, and complex tasks
not set
🔗 Get your Anthropic API key here
OpenAI
GPT-5.5, GPT-5.4 Pro, GPT-5.3 Codex, GPT Image, and other OpenAI models
not set
🔗 Get your OpenAI API key here
Google (Gemini)
Free tier available, good for light usage
not set
🔗 Get your Google AI Studio API key here
Meshy
3D model generation — text and image to 3D
not set
🔗 Get your Meshy API key at meshy.ai

2.5. Additional Providers optional

Configure alternative inference providers for cost/speed variety. Keys use the selected local secret storage.

3. Provider Controls

Enable or disable individual AI providers. When a provider is disabled, muLLM automatically falls back to the next cheapest available provider. Changes take effect immediately — no restart needed.

🤖 Local (Ollama) Free, private, runs on your GPU — highly recommended ON
🧰 Anthropic (Claude) Claude Sonnet/Haiku/Opus — best for code and reasoning
🤖 OpenAI GPT-5.5, GPT-5.4 Pro, GPT-5.3 Codex, GPT Image, and newer models as configured
🌐 Google (Gemini) Gemini Flash/Pro, Imagen 3 — cheapest cloud option

3.5. Routing Strategy

Choose how muLLM selects among configured cloud providers after groundtruth, cache, and local routing have already had a chance to answer.

Aggressive cost mode should remain explicit: it can save money, but it should never silently downgrade a forced cloud_power request below the selected tier.

4. Service Controls

Enable or disable individual routing capabilities. Changes take effect immediately — no restart needed.

Cloud Text Generation Allow routing to cloud LLMs (Anthropic, OpenAI, Google)
Cloud Image Generation Allow GPT Image / OpenAI image generation when configured
Cloud 3D Models Allow Meshy 3D model generation
Local Image Generation ComfyUI local image generation (free, GPU) — requires ComfyUI running
Allow NSFW Images Disable safety filter for local ComfyUI image generation
Local 3D Models ComfyUI Hunyuan3D local 3D generation (free, GPU)
ComfyUI setup checking...
muLLM checks http://127.0.0.1:8188. Install ComfyUI separately for local image, texture, LoRA, and Hunyuan3D workflows, then keep it running before enabling local media routing. Read the muLLM ComfyUI setup notes.
Linux/macOS: git clone https://github.com/comfyanonymous/ComfyUI && cd ComfyUI && python -m venv venv && ./venv/bin/pip install -r requirements.txt && ./venv/bin/python main.py
Windows: use the official portable build or run the same repository commands in PowerShell with venv\Scripts\python.exe main.py.
🧠 DeBERTa Routing Classifier ~5ms CPU — Layer 1.5 between rules and LLM escalation
📚 Claude Fable 5.1 Top Tier Use Claude Fable 5.1 as the Anthropic power model and in WITH RICE. Turning this off restores your configured power model.
Groundtruth engine: an in-process lookup system that answers thousands of deterministic queries (math, HTTP codes, Git, capitals, port numbers, etc.) in under 1ms — entirely free, no model needed, no network call. Default is the refactored registry with optional user realtime plugins. Legacy mode is a controlled fallback for parity debugging.
Bring-your-own classifier config

Configure these with environment variables or mullm.toml. HTTP classifiers must return JSON with category, complexity, and confidence.

Backendauto
Local pathnot set
HTTP endpointoff
ONNXoff
Retrainingoff
MULLM_CLASSIFIER_BACKEND=auto|rules|deberta|http|onnx MULLM_CLASSIFIER_MODEL_PATH=/path/to/transformers-model MULLM_CLASSIFIER_HTTP_URL=http://127.0.0.1:9001/classify MULLM_CLASSIFIER_ONNX_MODEL_PATH=/path/to/model.onnx MULLM_CLASSIFIER_RETRAIN_ENABLED=true MULLM_CLASSIFIER_RETRAIN_SCHEDULE=daily
⚡ Anthropic Prompt Caching ~90% discount on cached system prompt tokens — 5-min TTL, Anthropic only

5.5. Hybrid, Cloud & Metal GPU Providers optional

Configure burst GPU and private GPU endpoints. These are intended as a 2.5 tier between local desktop and expensive frontier cloud calls.

6. Security

Your keys are safe. They're stored in .env on your local machine only, never sent to muLLM's code or any third party. The .env file is automatically added to .gitignore and permissions are set to owner-only (600).

Ollama needs no API key — it runs entirely on your machine. Leave OLLAMA_API_KEY blank for local use.
Seal the .env file (advanced)
For maximum protection, make the config read-only then immutable. Once sealed, even root cannot modify it without explicitly removing the immutable flag. # Step 1: restrict to owner-read-only
chmod 0400 ~/.config/mullm/.env

# Step 2: make immutable (Linux — requires sudo)
sudo chattr +i ~/.config/mullm/.env
WARNING: After chattr +i the file cannot be modified or deleted without removing the immutable flag first. muLLM reads but never writes to a sealed config.

Emergency recovery: sudo chattr -i ~/.config/mullm/.env # remove immutable flag
chmod 0600 ~/.config/mullm/.env # restore write access
On macOS use sudo chflags schg ~/.config/mullm/.env and sudo chflags noschg to unseal.
Secret managers & env-from-vault (advanced)
If you prefer to keep plaintext keys out of .env entirely, muLLM supports loading values from an external secret manager at startup. Set values in .env using the SECRET: URI prefix and muLLM resolves them at startup — the plaintext never touches disk.

pass (Unix password store): ANTHROPIC_API_KEY=SECRET:pass:infra/openai_keys/anthropic
OPENAI_API_KEY=SECRET:pass:infra/openai_keys/openai
File-based (org secret mount): ANTHROPIC_API_KEY=SECRET:file:/opt/secrets/mullm/anthropic_key Environment passthrough (CI / Docker): If a key is already in the process environment (e.g. injected by Kubernetes Secrets or Doppler), just leave it out of .env entirely — muLLM picks it up from the environment automatically.

Other supported backends: HashiCorp Vault, AWS SSM/Secrets Manager, GCP Secret Manager, Azure Key Vault, 1Password CLI (op), Doppler CLI — contact support or see router/secrets.py for the resolver interface.
TLS 1.3 + Post-Quantum (inbound HTTPS)
muLLM listens on HTTP by default for local use. For remote/team access, put it behind nginx or Caddy and get TLS 1.3 + HSTS for free:

Caddy (automatic HTTPS, simplest): mullm.your-domain.com {
  reverse_proxy 127.0.0.1:6856
  tls {
    protocols tls1.3
  }
}
nginx + post-quantum (X25519MLKEM768 key exchange): ssl_protocols TLSv1.3;
ssl_ecdh_curve X25519MLKEM768:X25519;
ssl_stapling on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
All outbound calls to Anthropic/OpenAI/Google already use TLS 1.3 via Python's httpx with system OpenSSL. The post-quantum key exchange applies to inbound connections from browsers and other clients.

7. Remote Access Auth optional

muLLM supports Google OAuth2 / OIDC to protect the dashboard, setup, studio, bench, and debug pages when accessed from a non-localhost IP.

Localhost (127.0.0.1) and LAN (10.0.0.x) always bypass auth — no login required for local use.

To enable, set these three environment variables before starting the server:

GOOGLE_CLIENT_ID=<your-client-id>.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=<your-client-secret>
MULLM_BASE_URL=https://<your-public-host>:6856

Then add https://<your-public-host>:6856/auth/callback as an authorized redirect URI in your Google Cloud OAuth credentials.

Also install the auth dependencies:
pip install mullm[auth]

If GOOGLE_CLIENT_ID is not set, auth is completely disabled — no redirects, no 401s, everything works exactly as before.

8. IDE & Agent Integrations MCP · A2A · OpenAI-compat

muLLM works as a drop-in backend for tools you already use. Once installed it speaks three protocols:
Claude Code (MCP native)
Add muLLM as an MCP server so Claude Code can call it as a tool: # In ~/.claude/settings.json (or project .claude/settings.json)
{
  "mcpServers": {
    "mullm": {
      "command": "npx",
      "args": ["-y", "@0101/mullm-mcp"],
      "env": { "MULLM_URL": "http://127.0.0.1:6856" }
    }
  }
}
Or via CLI: claude mcp add mullm -e MULLM_URL=http://127.0.0.1:6856 -- npx -y @0101/mullm-mcp

Full MCP documentation →
Continue.dev (OpenAI-compatible)
In your Continue config (~/.continue/config.json): {
  "models": [{
    "title": "muLLM (local-first)",
    "provider": "openai",
    "model": "mullm-auto",
    "apiBase": "http://127.0.0.1:6856/v1",
    "apiKey": "mullm"
  }]
}
Aider (OpenAI-compatible)
aider --openai-api-base http://127.0.0.1:6856/v1 --openai-api-key mullm --model mullm-auto

Or set in ~/.aider.conf.yml: openai-api-base: http://127.0.0.1:6856/v1
openai-api-key: mullm
model: mullm-auto
VSCode (via Continue extension)
Install the Continue extension from the VSCode Marketplace, then follow the Continue.dev config above. muLLM will route code completions and chat locally (free, no cloud) and escalate to cloud only for complex generation.
Antigravity / other OpenAI-compat tools
Any tool that accepts a custom OpenAI base URL works with muLLM:

Base URL: http://127.0.0.1:6856/v1
API Key: mullm (or any string — not validated for local use)
Model: mullm-auto (let muLLM choose) or any cloud model name

A2A agent protocol documentation → · JSON-RPC 2.0 reference →

8.5. Run on Startup optional

Make muLLM start automatically when you log in. One command installs the right service for your OS:

GPU and power warning: installing the service means muLLM starts at every login (or boot when configured) and may load a large local model. That can reserve substantial VRAM and RAM and increase idle power use. Skip this step if you want to start muLLM only when needed.
mullm --install-service
▶ Manual setup — Linux / macOS / Windows

Creates a systemd user service — no root required. Runs after login, restarts on failure.

mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/mullm.service <<'EOF'
[Unit]
Description=muLLM local LLM router (HTTPS :6856)
After=network.target

[Service]
Type=simple
WorkingDirectory=~/newdev/newestmullm
ExecStart=~/.venv/bin/python -m router.main
Restart=on-failure
RestartSec=5
Environment=PYTHONUNBUFFERED=1
Environment=MULLM_REMOTE_ACCESS=true
Environment=MULLM_OPEN_BROWSER=0
Environment=MULLM_SSL_CERTFILE=~/newdev/newestmullm/certs/server.crt
Environment=MULLM_SSL_KEYFILE=~/newdev/newestmullm/certs/server.key

[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload
systemctl --user enable mullm
systemctl --user start mullm

8.8. Terrain & Map API Keys optional

The Terrain Builder (/terrain) works out of the box with procedural generation and USGS (free, CONUS). Add these keys to unlock global real-world DEM data.

OpenTopography — free, global 30m DEM (NASADEM, SRTM, Copernicus)
Cost: Free for non-commercial use. No rate limits for normal usage.
Sign up: portal.opentopography.org → My OpenTopo → Request API Key

Add to your systemd service (in ~/.config/systemd/user/mullm.service):
Environment=OPENTOPOGRAPHY_API_KEY=your_key_here Or set in your shell profile for the session: export OPENTOPOGRAPHY_API_KEY=your_key_here Covers: NASADEM (30m), SRTM GL1 (30m), SRTM GL3 (90m), Copernicus DEM (30m). Excellent for medium/large-scale terrain (~5km+).
Mapbox — global DEM tiles, higher resolution at city scale
Cost: Free tier: 50,000 tile loads/month (more than enough for dev). Pay only if you exceed that.
Sign up: account.mapbox.com → Create account → Access tokens → Create token

Add to your systemd service:
Environment=MAPBOX_TOKEN=pk.eyJ1... Resolution varies by zoom level: zoom 10 ≈ 100m/px, zoom 13 ≈ 10m/px. Best for city-scale or high-detail small areas.
After adding keys: restart muLLM (systemctl --user restart mullm.service) then reload the Terrain Builder — the data source status dots will turn green.

9. Commit Attribution

When muLLM generates code that gets committed, append a Co-authored-by trailer to the commit message — giving muLLM provenance without replacing any human author.

Install the git hook once per repo: mullm --install-git-hook