Repository navigation
v0.21.0
What's New in v0.21.0
Minor release. Theme: honest recall feedback, one access policy for MCP over
HTTP, and a server that reads the same uteke.toml as the CLI — recall and
search hits are counted apart from explicit gets (and once per call), a
read-only token can use the MCP read tools, uteke-serve honours
[embed_fallback], [tier] and more of [recall], namespaces start their
deprecation, and the release checksums are signed. 39 PRs since v0.20.1.
Upgrading: the first open by 0.21.0 migrates the store to schema v21
automatically (an in-place ALTER TABLE that adds memories.recall_count;
existing rows start at 0). The 0.21.0 release is the first whose
checksums-sha256.txt comes with a cosign signature bundle (see Security).
⚠️ Behavior Change
access_countnow only grows on an explicitget; recall and search hits go to the newrecall_count(#1337, #1397, schema v21) -recall,recall_contextandsearchbumprecall_countinstead ofaccess_count. Salience, aging (recompute_importance) and orphan scoring useaccess_count + 0.5 * recall_count, so automated recalls (session hooks, agents repeating a query) no longer reinforce the same memories as strongly as an explicit get. Historicalaccess_countcannot be split and is left as it is.Memorygains arecall_countfield (#[serde(default)], so old exports still import). Contract issue: uteke-cloud#135.- A recall is counted once, and only for the memories it returns (#1407, #1412) - a default (
fusion) recall bumped the counter 3 times per memory and also counted candidates that were never returned. The counter is now touched once per user-level call on the final results; a recall served from the recall cache now counts too.recall --explainand the point-in-time candidate search no longer touch counters. uteke-serveapplies more ofuteke.toml-[embed_fallback](#1414, #1415), thegraph_density_weight,graph_authority_weight,graph_rerank_enabledandjaccard_weightkeys of[recall](#1416, #1417), and[tier](hot_days,warm_days,hot_boost; #1418, #1419) were read by the CLI but silently ignored by the server. A server whose config already sets them now uses them; absent keys keep the previous behaviour.- HTTP
DELETE /forgetrejects a non-hex id with400 Invalid memory id '<id>' (expected a UUID or hex prefix), the rule MCP has had since #1328 (#1435, #1436; see Security).
Security
- Read-only tokens and MCP (#1439, #1441) -
POST /mcpused to be a write route, so a read-only token could not call any MCP tool, and a token that could reach it could call every tool. MCP now gates each tool: a read-only token can call the read tools (recall, search, list, get, stats, room and document reads) and gets a tool error (isError: true) from every write tool. Write tokens and the stdio transport are unchanged. %and_in a forget id no longer act as LIKE wildcards (#1435, #1436) -DELETE /forget?id=%25matched every memory whose id contains "25" and deleted it when exactly one matched. Id prefix resolution now escapes%,_and the escape character for every caller, and HTTP forget validates the id charset. MCP was never affected.- Signed release checksums (#1327, #1394) - the
Releaseworkflow signschecksums-sha256.txtwith cosign keyless signing and publisheschecksums-sha256.txt.bundlenext to it; the certificate is bound to this repository's workflow identity, so there is no key to trust. v0.21.0 is the first release with the bundle.SECURITY.md("Verifying a release") shows how to verify it.uteke upgradedoes not verify the signature yet. uteke upgradehardening (#1421, #1422) - the whole release tag must be[0-9A-Za-z.-]with at most one leadingv(an unchecked suffix used to reach the download URL and file name); the archive is capped at 128 MiB andchecksums-sha256.txtat 1 MiB, enforced while streaming; archive entries must be plain relative paths (no absolute path or..component).UTEKE_UPGRADE_SKIP_CHECKSUMstays, with a multi-line warning that the archive is not verified.- quinn-proto 0.11.19 (#1442) - fixes RUSTSEC-2026-0338 to RUSTSEC-2026-0342 in a transitive dependency of the HTTP client stack (uteke-cli, docgen).
Added
uteke_room_recallparity withuteke_recall(#1335, #1389, #1391, #1392) - optionalmin_score,tags(any-of),packwithbudget_charsandexclude_ids, andfull_ids; each result shows its memory id. In pack mode the response keeps theskippedreasons andlimitis applied afterexclude_ids.- Name filter for
uteke_room_list(#1336, #1393) - optionalname: a case-insensitive substring match on room id or title, combined withnamespace. Omitted, the full list is returned as before. - "Conventions first" rule (#1395, #1396) -
uteke guide,GET /guide, the bundled skill and a newinstructionsfield in the MCPinitializeresponse tell agents to look for the workspace's memory convention (a*conventions*room or doc, AGENTS.md, CLAUDE.md) before writing.
Changed
- One typed request per operation, shared by HTTP, MCP and the CLI (#1343; #1423 recall, #1424 list, #1425 remember, #1426 forget) - parsing, defaults, caps and validation moved to
uteke-core(recall_request,list_request,remember_request,forget_request). Extraction only: routes, shapes, defaults, caps and error texts are unchanged (except the forget id fix above); the remaining surface differences are explicit policy values. - The API registry drives routing and the read-only gate (#1344, #1437) -
api_registry::ENDPOINTSis the table the router and the read-only-token gate read; a route without a registry row answers 404 before any handler runs, so a new write route is gated by construction. Behaviour is unchanged;GET /routesand the generated docs are byte-identical. - Recall paths without an embedder return an error instead of panicking (#1439, #1443) - defensive: none of these paths is reachable today.
retry_embedalso returns validation errors at once instead of retrying them.
Deprecated
- Namespaces (#1427, #1434, phase 1: the signal) - namespaces are deprecated and will be removed in a future 0.x release; organise with rooms, tags and author instead. Nothing changes in routing, storage or reads, and the
namespaceparameter keeps working everywhere. Writing to a non-default namespace (omitting it or passingdefaultis not deprecated) now returns a one-sentence warning: thewarningfield of HTTP/rememberand/room/remember, an optionalwarningon/extract,/import,/room/createandPUT /memory(absent for the default namespace, so those responses are byte-identical), the tool text of MCPuteke_remember,uteke_updateanduteke_room_create, and one stderr line fromuteke remember,uteke importanduteke room create(stdout and--jsonunchanged). The server logs it at WARN once per distinct namespace. MCP tool descriptions,uteke guide, the skill and the docs ("Namespaces are deprecated" indocs/multi-agent.md, with the phase plan) steer to rooms, tags and author.
Fixed
- An explicit --store no longer routes through a running server (#1439, #1444) - with
[server] enabled = trueanduteke-serverunning,remember,recall,search,list,statsandforgetwent to the server, which serves its own store, so--store <other path>silently read and wrote the wrong database. An explicit--storenaming a different store now always runs locally;--storepointing at the default store still uses the server.
Docs
- Reaching the server from another device on the LAN (#1431, #1433, #1438, #1447) - a LAN access guide in
docs/configuration.md(token first, bind address, read-only token, Host header, plain-HTTP caveat), MCP authentication options indocs/mcp.md, and both installers now end with an optional note pointing to the guide. No default changes. - Docker (#1413, #1420) -
.envversusenvironment:/env_file:in Compose,UTEKE_AUTH_TOKEN, and the external-embedder setup. - Reading recall scores (#1405, #1406, #1408, #1409) - what each strategy's score means, the additive salience/recency boosts (default weight 0.1 on both CLI and server) and what that means for
--min. - Internal: release procedure, mutation gate and memory conventions in AGENTS.md (#1382, #1388, #1404, #1440), Homebrew tap PR format and checksum check in the release workflow (#1384), Cora review against the PR's base branch (#1386), raw v0.20.0 LongMemEval results (#1390), mutation-killing tests (#1403), README anchors and CHANGELOG link refs (#1411, #1428, #1429, #1430).
📦 Downloads
Each archive contains three binaries + ONNX Runtime shared library:
| Binary | Description |
|---|---|
uteke |
CLI tool |
uteke-serve |
HTTP server daemon |
uteke-mcp |
MCP server (stdio + HTTP) |
libonnxruntime.so* / libonnxruntime*.dylib / onnxruntime*.dll |
ONNX Runtime |
| Platform | File |
|---|---|
| Linux x86_64 (AVX2) | uteke-x86_64-unknown-linux-gnu-v0.21.0.tar.gz |
| Linux x86_64 (Legacy, SSE4.2) | uteke-x86_64-unknown-linux-gnu-legacy-v0.21.0.tar.gz |
| Linux ARM64 | uteke-aarch64-unknown-linux-gnu-v0.21.0.tar.gz |
| macOS Apple Silicon | uteke-aarch64-apple-darwin-v0.21.0.tar.gz |
| Windows x86_64 | uteke-x86_64-pc-windows-msvc-v0.21.0.zip |
Legacy Bundle (Linux only) — Includes a SSE4.2-only ORT sidecar (
ort-legacy/) for CPUs without AVX2 (Intel Celeron J4125/N4020). Use this bundle to avoid SIGILL crashes on older hardware.
🚀 Quick Start
# Quick install (Linux / macOS)
curl -fsSL https://raw.githubusercontent.com/codecoradev/uteke/main/install.sh | sh
# Pin a specific version
UTEKE_VERSION=v0.21.0 curl -fsSL https://raw.githubusercontent.com/codecoradev/uteke/main/install.sh | sh
# Store a memory
uteke remember "Important context" --tags project
# Recall by meaning
uteke recall "what was that context?"
# Start server for fast AI agent access
uteke-serve --port 8767Full changelog: https://github.com/codecoradev/uteke/blob/main/CHANGELOG.md
Community contributors
(No external contributions in this cycle. Full contributor list: https://github.com/codecoradev/uteke/graphs/contributors)