Everything local with Ollama
Run orboto on your own box with Ollama next to it: chat and embeddings from local models, and an agent that works your tickets on a local model too.
This page is the fully local path: orboto in Docker, Ollama on the same machine (or another one in your network) for the in-app AI, and an autonomous agent on a local model. Nothing leaves your network, no API key is involved anywhere.
It assumes the Docker install is up and you can sign in as an admin.
1. Ollama on the host
Install Ollama and pull one chat model and one embedding model. A
coding-capable chat model in the 7B to 30B range and nomic-embed-text
for embeddings are a sensible start:
ollama pull qwen2.5-coder:14b
ollama pull nomic-embed-textOllama listens on 127.0.0.1:11434 by default. The orboto containers
reach it through host.docker.internal, which only works when Ollama
also accepts connections on the Docker bridge. The simplest way is to
bind it to all interfaces before starting it:
OLLAMA_HOST=0.0.0.0 ollama serveKeep the port closed on your firewall for anything outside the box; the containers talk to it over the bridge, not the internet.
2. Reaching the host from the containers
Inside a container, localhost is the container itself, so the admin
default of http://localhost:11434 cannot work. Use
http://host.docker.internal:11434 instead.
The shipped docker-compose.yml maps host.docker.internal to the host
on every Docker engine, Linux included, through this entry on the api
and worker services:
extra_hosts:
- "host.docker.internal:host-gateway"If your compose file predates that line, add it to both services and
recreate them (docker compose --env-file .env.prod up -d). Check it
from inside:
docker compose exec api sh -c 'wget -qO- http://host.docker.internal:11434/api/tags | head -c 200'That prints the model list Ollama serves. An empty answer or a timeout means the bind in step 1 is missing or a firewall on the host drops traffic from the Docker bridge.
Ollama on another machine in your network works the same way with that
machine's address instead of host.docker.internal.
3. Wire the in-app AI
In Admin → AI:
- Provider: pick Ollama, set the base URL to
http://host.docker.internal:11434, click Switch to Ollama. No key. - Default model: Load models lists what Ollama serves; pick the chat model.
- Embeddings: pick Bring your own provider → Ollama with the same
base URL, load models, pick
nomic-embed-text. Confirm the rebuild when orboto asks; on a fresh workspace it finishes in seconds.
The AI settings page explains every field, including per-feature model overrides and the rate limit. Chat, summaries, duplicate detection and search now run on the box.
Context window
A local model starts with a small context by default, and the in-app assistant sends ticket text, comments and retrieved docs with every question. If answers come back truncated or the model loses the thread, raise the window in a Modelfile and use that tag as the default model:
FROM qwen2.5-coder:14b
PARAMETER num_ctx 16384ollama create qwen-coder-16k -f ModelfileThe same applies to any MCP client on a local model; the details and the
minimal toolset for 8k windows are in
Connect an AI client.
4. An agent on a local model
The first AI worker guide's setup wizard
offers Ollama as the provider: pick it, point it at
http://localhost:11434 (the runner runs on the host, not in a
container), and choose a model from the list it fetches. The wizard
installs the pi-lm-providers extension that gives the runner Ollama
support. Everything else in that guide is unchanged: the bot account, the
key, the project, the review duo.
For a fleet of lanes under systemd, the model and its fallback chain live in the lane assignment, see Run a fleet.
What to expect
Local models are slower and less reliable than the frontier ones. The review gate in orboto is there for exactly that: an agent hands a ticket to review, a human or a second agent approves it. Start with one worker on a 14B model and a small project, watch Admin → Multi-Agent for a day, and raise the ambition from there.