Run LLMs locally with Harbor
Harbor is a containerized LLM toolkit. Default harbor up starts Open WebUI (webui) and llama.cpp (llamacpp). This skill is the operational playbook for installing Harbor, choosing a backend, pulling models, wiring search/voice/code tools, and pointing coding agents at the same stack.
For the full CLI catalog, harbor skills get harbor. For Boost module authoring, use the boost-modules skill.
Agent rules
harbor logsfollows forever and will hang a non-interactive shell. Read logs withdocker logs harbor.<service>(add--tail 200if needed).- Never edit
.envby hand. Useharbor config get/setandharbor env. - Do not set
llamacpp.model/llamacpp.model.specifierunless the user explicitly wants a single pinned GGUF. Router mode (empty specifier) discovers pulled GGUFs automatically. harbor launchoptions (--backend,--model,--web,--workflow,--config,--service) go before the tool name. Everything after the tool name is the tool's own argv.- After
harbor update, runharbor config updateif new keys are missing from the local config.
Read only what you need
| File | When |
|---|---|
references/models.md |
Pull, list, remove, routing, HuggingFace token/cache |
references/backends.md |
llamacpp, ollama, vLLM, DMR, MLX, oMLX, ikllamacpp |
references/stack.md |
webui, searxng, speaches, openterminal, tunnels |
references/launch.md |
Codex, Claude Code, Grok, OpenCode, Boost --web/--workflow |
references/troubleshooting.md |
GPU, OOM, won't start, UI/model missing |
Decision trees
User wants to run an LLM
1. Harbor installed? (`harbor --version`)
โ NO: install (see Initial setup)
2. Docker running? (`docker info`)
โ FAIL: start Docker
3. Platform / backend:
โ Apple Silicon Metal: dmr, mlx, or omlx (see backends.md)
โ NVIDIA/AMD Linux, unspecified: llamacpp (default) or ollama
โ HF safetensors / production serving: vllm
4. Model:
โ none specified: pull a small GGUF, then `harbor up`
harbor pull unsloth/Qwen3.5-4B-GGUF:Q4_K_M
harbor up
โ Ollama tag (`qwen3.5:4b`): harbor up ollama && harbor pull <tag>
โ HF GGUF (`org/repo[:quant]`): harbor pull <spec> && harbor up llamacpp
โ safetensors: harbor vllm model <org/repo> && harbor up vllm
โ DMR/MLX/oMLX: harbor models pull --source <src> <spec> (see models.md)
5. Verify: harbor ps, harbor models ls, harbor openUser wants a coding agent on a local model
1. Backend running or named with --backend (launch starts it if stopped)
2. harbor launch --backend <svc> --model <id> <tool>
Common tools: codex, claude, grok, opencode
3. Need web search in the agent? add --web (not with claude)
4. Need a Boost quality/research pass? --workflow quickhop|deephop|autocheck
5. Codex + llama.cpp-family can fail on Responses API tool schema
โ use opencode with llamacpp, or Codex with ollama/vllm/dmr/mlx/omlx
See references/launch.mdUser wants web search in chat
1. harbor up searxng
2. If webui was already running: harbor restart webui
3. harbor open โ web search is wired in Open WebUIUser wants code execution in chat
1. harbor up openterminal
2. harbor open โ Open WebUI gets a pre-wired Open Terminal connectionUser wants voice in chat
1. harbor up speaches
2. If webui was already running: harbor restart webuiUser wants to change the model
1. harbor ps โ which backend is up
2. ollama: harbor pull <tag> (pick in UI)
llamacpp: harbor pull <org/repo[:quant]> (router discovers it)
vllm: harbor vllm model <org/repo> && harbor restart vllm
dmr/mlx/omlx: harbor models pull --source <src> <spec>
3. Do not set llamacpp.model to "switch" models in router modeUser has GPU issues
1. NVIDIA: nvidia-smi
AMD: rocminfo or ls /dev/kfd /dev/dri
Apple: use dmr/mlx/omlx (host Metal), not a Linux CUDA image
2. NVIDIA toolkit: docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
3. docker logs harbor.<backend> โ CUDA / ROCm / OOM / no GPU
4. See references/troubleshooting.mdInitial setup
Prerequisites
docker --version # 20.10+
docker compose version # 2.23.1+
git --versionLinux: add the user to docker (sudo usermod -aG docker $USER) and re-login if docker needs sudo.
Install Harbor
Recommended:
curl -fsSL https://raw.githubusercontent.com/av/harbor/refs/heads/main/install.sh | bashUse | bash, not | sh. Then source ~/.bashrc (or ~/.zshrc) and:
harbor --version
harbor doctorFor an agent to install Harbor itself:
# Claude Code
curl -fsSL https://raw.githubusercontent.com/av/harbor/refs/heads/main/install.md | claude
# Codex
codex "$(curl -fsSL https://raw.githubusercontent.com/av/harbor/refs/heads/main/install.md)"First start
harbor upExpect harbor.llamacpp and harbor.webui healthy. First WebUI boot downloads embedding/Whisper weights; healthcheck grace can be several minutes.
harbor pull unsloth/Qwen3.5-4B-GGUF:Q4_K_M
harbor models ls
harbor openCreate the local Open WebUI admin account in the browser, pick the pulled GGUF, send a test message.
Core commands
| Command | Purpose |
|---|---|
harbor up [services...] |
Start defaults plus any named services |
harbor up --no-defaults <svc> |
Start only what you name |
harbor down |
Stop stack (also stops DMR/MLX/oMLX host runners) |
harbor ps |
Running containers |
docker logs harbor.<svc> |
Safe log read for agents |
harbor open [svc] |
Open default UI or a named service |
harbor url [--lan|--internal] <svc> |
Print URL |
harbor pull <svc|model> |
Compose image pull, or smart model pull |
harbor models ls / pull / rm |
Cross-source model management |
harbor launch ... <tool> |
Host coding tool against a Harbor backend |
harbor restart [svc] |
Restart |
harbor doctor |
Diagnostics |
harbor config get/set/ls/search/update |
Global config |
harbor env <svc> [key [value]] |
Per-service override.env |
harbor defaults ls/add/rm |
Default harbor up set |
Config
harbor config ls
harbor config search port
harbor config get webui.host.port
harbor config set webui.name "My AI"
harbor config update # merge new keys from profiles/default.env
harbor env ollama # list service overrides
harbor env ollama OLLAMA_NUM_PARALLEL 4harbor defaults # default is webui;llamacpp
harbor defaults add searxng
harbor defaults rm llamacpp
harbor defaults add ollama # if the user wants Ollama as the default backendharbor profile ls
harbor profile save mysetup
harbor profile use mysetup
harbor profile rm mysetupProfiles are partial. Changes after use are not auto-saved.
Common stacks
# Default chat UI + GGUF backend
harbor up
harbor pull unsloth/Qwen3.5-4B-GGUF:Q4_K_M
harbor open
# Ollama registry models
harbor up ollama
harbor pull qwen3.5:4b
harbor open
# Web search + voice + code execution in Open WebUI
harbor up searxng speaches openterminal
harbor open
# Apple Silicon Metal
harbor up webui mlx
# or: harbor up webui dmr
# or: harbor up webui omlx
# Coding agent on a running backend
harbor launch --backend ollama --model qwen3.5:4b codexLAN URL / QR: harbor url --lan webui, harbor qr webui. Temporary internet tunnel: harbor tunnel webui, then harbor tunnel down.