Repository navigation
v1.5.3
A self-hosted release. The headline fix is that a local model server connected through Settings β AI now actually answers requests; the rest is a sweep of readability and clarity work across the UI, and the end of a long-running test flake.
A custom endpoint failed every request while looking connected
Adding an Ollama, vLLM, or LM Studio server and leaving the capabilities on Automatic β which is what you get by adding an endpoint and changing nothing else β resolved to the endpoint but named no model, and the compat adapter refuses to be called without one. Every Magic Paste, mention, and summary failed with a model must be selected for OpenAI-compatible endpoints, from a settings page reporting the endpoint as connected.
The three built-in providers map a capability onto a model themselves, so Automatic passes them no model on purpose. A compat endpoint has no such map β its model ids are whatever you happen to have pulled β so Automatic now names one: the first chat model in the catalog discovered from the endpoint. Quick and Deep get the same model, because nothing in the OpenAI-compatible model list says which of yours is the cheaper one, and ranking them by name would be a judgement you cannot see. Pin them separately if you run both a small and a large model.
When discovery found no chat model there is nothing to call, so Automatic now skips the endpoint and the capability says so, naming the endpoint and the fix, rather than failing later with a message about model ids.
Two configuration mistakes produce that same "could not reach endpoint" error and neither is guessable from it, so the endpoint dialog and Configuration now call both out: the base URL must end in /v1, and inside Docker localhost means the container, not your machine.
Four more faults in the same flow
- Settings β AI listed every custom endpoint twice, and the second copy carried a "remove" button that removed nothing: it deleted from the provider-key store, where an endpoint has no entry, then reported success. Endpoints now appear once, in their own section, which is also where their model count, discovery errors, and a refresh button live.
- A capability pinned to a deleted provider kept pointing at it. Quick, Deep, and Research fall back to Automatic with a warning, but Embeddings resolved straight to the dead provider and every embed threw β semantic search and duplicate detection stopped working with nothing in the UI to explain why, because the pin still looked valid. Removing a provider or endpoint now returns anything pinned to it to Automatic.
- A pin naming only the endpoint β which the API accepts, and which means "use this endpoint, you choose" β hit the same missing-model failure.
- Startup logged both vector stores at their creation width regardless of what they actually held. Those literals only apply to a fresh database; choosing a different embeddings model rebuilds the tables at that model's width. Vector width is the first thing you check when embeddings misbehave, so a hardcoded number there is worse than no number.
The integration flake is fixed at the source
request(app) made supertest bind a fresh HTTP server and tear it down for every single request β roughly 500 listen/close cycles a run. Ephemeral ports recycle faster than closed sockets leave TIME_WAIT, so a new server occasionally inherited a port a previous connection was still addressing, and a request was answered by the wrong socket. The symptom was a status the route cannot produce: a 404 from a registered path, a 403 from a router with no 403 in it, a 401 on an un-gated instance β each one an invitation to audit auth code that was never involved.
Each test file now listens once and every request goes to that server. Measured with retries disabled: roughly one failed run in six before, none in thirty after. The retry: 2 that had been absorbing it is gone, so the suite reports instability instead of hiding it.
New coverage drives a stub server speaking the OpenAI wire format through the real adapter, real base-URL handling, and real model discovery β including the exact case the headline bug lived in. Three of those tests fail on 1.5.2.
UI
- The health score explains itself. Clicking the badge on the Pulse at-risk list breaks the number into its five signals with the measurement behind each β "last contact 200 days ago, against a 90-day cadence" rather than "42". A score attached to a person is a judgement, and one you cannot interrogate is one you either over-trust or ignore.
- The duplicate badge is a count, and it counts the right thing. It read pending pairs while the review queue groups pairs into clusters, because (A,B) and (B,C) are one problem with three people rather than two. The badge promised 7 and the page showed 3.
- Settings has a filter, matching synonyms too β "logout" finds Account, "bin" finds Trash.
- Shift-click selects a range; Cmd/Ctrl+A selects everything visible. Ranges add rather than toggle, and the shortcut is ignored while focus is in a field.
- Session lifetime is configurable (1 day to 1 year) rather than fixed at 30 days. It applies to new sign-ins only, which the card says out loud.
- Readability fixes: the bulk selection toolbar was 80% transparent over the list it acts on; the map opened centred on the Atlantic and left empty background on tall windows; the AI usage feed's separators referenced a colour token that did not exist and rendered near-black; an un-researched contact's Dossier tab was blank; five of fourteen AI cache tiers printed raw keys like
queryParse. - Duplicates now leads the Organize group β it is the one destination there with work queued behind it, and a queue nobody sees is a queue nobody clears.
CI
The image-architecture check could only ever fail. It grepped the raw manifest for "architecture":"amd64", but current buildx pretty-prints --raw, so the compact-JSON pattern never matched and merge-image reported a missing platform on every push while publishing a perfectly good two-architecture image. Parsed with jq now, filtered to os == "linux" so the per-platform provenance attestations are not counted as platforms.
Full changelog: v1.5.2...v1.5.3