LLM providers
Ollama, Anthropic, OpenAI and other OpenAI-compatible servers, with the model fields, the key and a note on summary quality
Two models are involved: the summary model writes per-item summaries and the reader-profile rewrite, the digest model writes the digest itself. The digest is the demanding one: structured JSON over up to 300 items, with a narrative per section. See Summarization for what each call does.
Ollama (local, free)
Everything stays on your own hardware and no data leaves it. Ollama exposes an OpenAI-compatible
API, so it is configured through the openai provider.
Configure
Run Ollama on the Docker host and pull the models you want to use:
ollama pull qwen3:14b
ollama pull llama3.1:8bLLM_PROVIDER=openai
OPENAI_API_KEY=ollama # any non-empty value
OPENAI_BASE_URL=http://host.docker.internal:11434/v1
LLM_MODEL_DIGEST=qwen3:14b
LLM_MODEL_SUMMARY=llama3.1:8bNote the base URL: from inside a container, localhost is the container itself. The host running
Ollama is host.docker.internal.
Docker Desktop resolves host.docker.internal out of the box. Nothing more to do.
The name has to be mapped explicitly, on both the app and the worker service, since both
run LLM jobs (the worker on its schedules, the app for the manual Fetch now and Generate
digest now buttons):
app:
# ...
extra_hosts:
- "host.docker.internal:host-gateway"
worker:
# ...
extra_hosts:
- "host.docker.internal:host-gateway"Models
| Field | Example | Note |
|---|---|---|
LLM_MODEL_SUMMARY | llama3.1:8b | Summaries are an easy task; an 8B model is fine |
LLM_MODEL_DIGEST | qwen3:14b | Use the roomiest model your hardware runs; retry bigger on failures |
Summary quality
Per-item summaries come out well on small models. The digest is where small models struggle: it
must return one valid JSON document covering every item, and a model that drifts into prose or
truncates the answer fails with Model did not return valid JSON after retry. The digest is then
stored as failed with the raw output attached. If that happens, move LLM_MODEL_DIGEST to a
bigger model. Support is best effort, as servers and models vary in JSON-mode support.
Anthropic
The default provider.
Configure
LLM_PROVIDER=anthropic
ANTHROPIC_API_KEY=sk-ant-...The key needs API credits on platform.claude.com. A Claude subscription does not cover API use.
Models
| Field | Default |
|---|---|
LLM_MODEL_SUMMARY | claude-haiku-4-5 |
LLM_MODEL_DIGEST | claude-sonnet-4-6 |
Responses are streamed and assembled, so a long digest cannot hit an HTTP timeout.
Summary quality
The defaults are what the cloud version runs. Summaries are precise and the digest JSON is reliable; there is no reason to change the models unless you want to trade cost for quality.
OpenAI
Configure
LLM_PROVIDER=openai
OPENAI_API_KEY=sk-...Models
| Field | Default |
|---|---|
LLM_MODEL_SUMMARY | gpt-5-mini |
LLM_MODEL_DIGEST | gpt-5 |
Calls use JSON mode and max_completion_tokens, so reasoning models work as well.
Summary quality
Comparable to the Anthropic defaults. Pick by price and by which account you already have.
Other OpenAI-compatible servers
OpenRouter, LM Studio and similar servers work through the openai provider with
OPENAI_BASE_URL set to their endpoint, for example https://openrouter.ai/api/v1, and the
server's key in OPENAI_API_KEY. Model names are whatever the server expects. This is best effort:
JSON-mode support varies, and the same advice as for Ollama applies to the digest model.