Skip to content

v1.4.0

Choose a tag to compare

@arvarik arvarik released this 06 Aug 17:22
· 258 commits to main since this release

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.0

Full detail in CHANGELOG.md.