Repository navigation
v1.4.0
Contrack no longer asks you to pick "an AI provider". You connect whichever services you have keys for, and each kind of work is routed to a suitable model.
One API key is still all you need. Everything below is optional.
Configure AI by task, not by provider
Four independent settings, each resolved from Settings → AI, an environment variable, or automatically:
| Task | Powers | Default |
|---|---|---|
| Quick tasks | Magic Paste, @mentions, search understanding, daily insights | Auto |
| Deep tasks | Email digests, duplicate adjudication, research extraction | Auto |
| Embeddings | Semantic search + duplicate similarity | Built-in local model |
| Web research | AI Search enrichment across the live web | Auto |
Providers are no longer mutually exclusive — connect Gemini, OpenAI and Anthropic at once and mix them across tasks. Settings collapses to a single line ("All tasks → Google Gemini, chosen automatically") with per-task controls behind a disclosure that opens only when you've customized something.
Bring your own models
Model discovery. Saving an API key queries the provider's list-models endpoint — validating the credential and filling the dropdowns — so newly released models appear without a Contrack update.
Any OpenAI-compatible server. Ollama, vLLM, LM Studio, llama.cpp, OpenRouter, xAI, DeepSeek, Mistral: add a base URL and an optional key. Structured output is negotiated per model and the working mode is remembered.
Self-hosted web research via SearXNG. Point Contrack at a SearXNG instance and enrich contacts from the live web with no cloud provider involved. Combined with a local chat model and the built-in embeddings, the entire AI stack can run on your own hardware.
Per-task environment overrides for declarative deployments: AI_QUICK_MODEL, AI_DEEP_MODEL, AI_RESEARCH_MODEL, AI_EMBEDDINGS_MODEL — each accepting model or provider:model. A pin made in Settings wins.
Important fixes for anyone running v1.3.0
Two of these affected data written by the previous release. Both indexes repair themselves automatically on first start — no action needed.
- Gemini embeddings returned one vector per batch instead of one per contact. Switching the Embeddings setting to a Gemini model left the semantic index almost entirely empty while reporting success.
- Duplicate-detection embeddings had the same defect, plus a backfill that only ran when the store was completely empty — so a partial index could never repair itself. On a 431-contact database it held 5 rows. Duplicate matching has been running without the semantic signal it was designed around. Restoring it raises match scores but crossed no auto-merge thresholds in testing (0 of 381 candidate pairs).
- Anthropic structured output was broken entirely — every JSON operation failed with a 400 because Contrack sent OpenAI's schema shape. Only text-only calls worked.
- Duplicate-detection embeddings previously called Gemini directly regardless of your Embeddings setting, so choosing a local model still sent every contact to Google. They now follow the setting.
- Magic Paste output is sanitized before it reaches a contact record.
Upgrading
No migration steps. Existing single-key deployments behave exactly as before — AI_PROVIDER now simply expresses which provider Auto should favour when several keys are present.
If you previously set AI_FAST_MODEL or AI_SMART_MODEL, rename them to AI_QUICK_MODEL and AI_DEEP_MODEL. The old names described the model rather than the work, and mapped onto an internal tier taxonomy this release replaces.
Container images are published for linux/amd64 and linux/arm64 — earlier
releases were amd64-only, so Apple Silicon and ARM homelab hosts could not pull
them.
docker pull ghcr.io/arvarik/contrack:1.4.0Full detail in CHANGELOG.md.