Repository navigation
1.0.3 — Ollama models
Local models, and two ways to stop the diff drowning out the code.
Ollama models
Any model can now run on a local or self-hosted Ollama server by prefixing its name with ollama: — everything after the prefix is the Ollama model name verbatim, tag included:
{
"models": {
"summary": "ollama:ornith-1.5:35b",
"final": "sonnet"
}
}The two stages resolve independently, so the mixed setup is the interesting one: reading the diff is the bulk of the work and the most sensitive thing cco touches, so it runs locally and free, while the final message still goes to Claude. The prefix works anywhere a model name does, including --model-summary and --model-final.
cco talks to Ollama's native /api/chat endpoint rather than either compatibility layer, because only the native API can set a context length — and Ollama truncates an oversized prompt silently (HTTP 200, oldest content dropped, nothing in the response to say so). So every request pins an explicit window, chunks are sized against the same number, and the returned token counts are checked afterwards to catch a truncation that happened anyway.
Where that number comes from is ollama.context, which defaults to "auto": the model is preloaded with no window set, Ollama applies its own VRAM-based choice, and cco reads that choice back from /api/ps before sizing anything. A number pins the window instead.
Other differences from a Claude model: cost is reported as zero, structured output falls back to plain-text parsing when the server cannot honour format, a missing model is an error rather than a multi-gigabyte download, and reasoning is never requested.
New config keys ollama.host (defaults to $OLLAMA_HOST, then http://localhost:11434), ollama.context and ollama.keepAlive, plus --ollama-host and --ollama-context flags.
lowPriorityPaths
Gitignore-style patterns for churn-heavy paths — lockfiles, snapshots, generated docs — whose changes are summarised separately so they cannot crowd out the code in the final message. The content is still read and still costs the same; only its weight in the message changes. --no-low-priority-paths switches it off for one run.
ignore
For content worth neither the tokens nor the time. The same pattern syntax, but matching file sections are removed from the diff before anything else looks at it — before the low-priority partition, before chunking, before any model call. The files are still committed; ignore governs what the model reads, never what git stages. When a pattern matches everything, cco stops with an error naming the directive rather than inventing a message about changes you told it not to read. --no-ignore for that one commit.
Also
- The default spinner is now
material. @opentui/corebumped to 0.5.7, plus SDK and skill dependency bumps.- CI workflows bump
checkout,setup-nodeandclaude-code-action.
Full changelog: 1.0.2...1.0.3