Repository navigation
v0.20.0
What's New in v0.20.0
Minor release. Theme: one write policy for the vector index, atomic documents,
shared config resolution, and a security/robustness sweep — every index
mutation now goes through a single module, document upserts are
embed-then-commit, uteke.toml is resolved by one implementation for the CLI and
the server, GET /graph finally serves the data remember writes, and the
validated findings of the v0.19.1 review (#1319) are fixed. 29 PRs since v0.19.1.
⚠️ Behavior Change
- List
limitis capped at 1000 on/list,/recent,/contradictions,/doc/listand deprecated listings (#1321);/extractmax_factsis capped at 100. Defaults are unchanged. - CORS is off by default (a wildcard
*is opt-in), 500 responses carry a generic body, and request query strings are no longer logged (#1321). - Project-local
.uteke/uteke.tomlcan no longer set credentials, endpoints or[server](embedding.{backend,api_key,base_url,endpoint_path},embed_fallback.*andextraction.*credentials/endpoints, the whole[server]section); set them in the global config, orUTEKE_TRUST_PROJECT_CONFIG=1to trust the file (#1321, #1354). The server now applies the same rule and merges project sections per key instead of replacing whole sections. GET /graphnode ids are memory ids (they were graph-node ids), edges are the livememory_edgesplus explicit graph edges, and the response gainsnode_id/limitquery parameters and atruncatedflag; edges also carrysource/target(#1366, #1370).POST /graph/edgestill returns the node ids it created and both id kinds are accepted.- Document upsert/update is atomic: if embedding fails (or no embedder is available) nothing is written, instead of leaving a half-written document (#1350). Re-parenting through
doc upsertnow moves the whole subtree and rejects cycles and results deeper than 10 levels (#1378). - Bulk "cold" forget skips pinned memories (#1333).
- List/search/
list_at_timepayloads carry the storedslug,source,source_type,author_type,deprecated_atinstead of defaults (#1346, #1333). Shape unchanged. - Auto-created
similar_to/possible_duplicatelinks no longer point at deprecated memories and small namespaces inside a large index now get their own links (#1371). The defaultfusionrecall does not read edges; LongMemEval fast50 (default strategy) is unchanged: recall@5 0.980, recall@10 1.000.
Security
- Host header validation blocks DNS rebinding (#1326, #1360).
/importsize limit,/mcpbody limit and CORS, andresolve_idhardened (#1328, #1359): the import cap and its 413 message agree with the body limit, an oversized/mcpbody returns 413, and ids accept only hex digits and dashes (no LIKE wildcards in the prefix scan).- A lock timeout no longer deletes the index files of another process; the server releases its request slot on panic; the CLI sends
UTEKE_AUTH_TOKENto the local server (#1320). - LIKE wildcards in document paths are escaped (#1378):
_and%in a stored path used to match unrelated documents, so moving or deleting/my_doc/could rewrite or remove/myxdoc/....
Added
full_idsoption for MCPuteke_list,uteke_recallanduteke_room_memories(#1357, #1358): prints full UUIDs instead of the 8-character prefix, which is ambiguous for UUIDv7 ids written within ~65 s.GET /graph?node_id=&limit=and an MCPuteke_graphthat lists the latest edges and takeslimit(#1370).- Vector index sidecar consistency check on load (#1325, #1362): the
.keysfile carries a digest and row count of the index; a mismatch (crash between the two renames, missing sidecar) rebuilds the index from SQLite. doc exportwrites every document to--outputand honours the namespace; JSON export is an array of full documents (#1376).- Namespace/room/tag conventions in the bundled skill (#1356) and a refreshed skill with a command-coverage test (#1329).
- Configuration docs: what a project config may not set.
Changed
index_sync: one module owns every vector index write (#1340, #1347, #1348): a single retry/persist policy, deterministic dimension errors are not retried, and an outcome that says what actually landed. 60 hand-written call sites across 7 modules went away.- Index saves are batched (#1322, #1363): a save happens after 64 mutations or 2 s, with flushes on shutdown and drop, instead of rewriting the whole index on every write.
- vecq index is compacted when dead rows pass 25 % (#1324, #1364).
- The embedder lock is released between document chunks (#1323, #1361).
rememberno longer scans the namespace for dedup and auto-linking (one query over the candidates) and no longer holds the index write lock while wiring edges (#1368, #1371).uteke.tomlis resolved by one module for the CLI and the server (#1342, #1354): per-key merge, one untrusted-key policy, per-layer validation; adding a config key now needs only a struct field.- All
memorySELECTs share one column list with the row decoder (#1339, #1346). - Edges to deprecated memories no longer count in graph rerank or edge traversal (#1367, #1373).
Fixed
- FTS5 results had shifted metadata columns (#1333):
slug,source,source_type,author_type,deprecated_atwere misread on hybrid recall andrecall_explain. - The exclusive index lock was lost after the first save on Unix (#1333): the flock stayed on the replaced inode.
doc_searchpaired chunk scores with the wrong rows when a chunk row was missing (#1333);resolve_db_pathno longerchmods a directory it did not create (#1333).- Changing a document title failed with "database corruption" or left stale tokens in the search index (#1349, #1351): the
documents_ftsupdate/delete triggers now use the FTS5'delete'command; existing stores are healed and the index rebuilt on open. - MCP
uteke_graph_add_edgeanddreamcontradiction edges violated the graph FK (#1365, #1370). - Documents:
has_childrenstays in sync on delete and re-parent,moveof a legacy row with an empty path no longer rewrites every document (#1375); a re-parenting upsert carries its descendants (#1377, #1378). tags renameonto an existing tag duplicated it,VectorIndex::buildon an empty store reset the dimension to 768, andrecompute_importanceloaded every embedding and committed per row (#1375).- CLI:
verify-checksums --jsonexits 1 on a mismatch and matches the file name exactly;[lifecycle],[aging] max_access_count,update_checkanddoctor_footerin config files are honoured; non-ASCII titles no longer panic;doc move/update --jsonis valid JSON (#1334, #1376). - CLI recall flags the server cannot honour fall back to the local store instead of being dropped;
list --entity/--categorypaginates the matches;doc list --treeprints descendants;upgradeverifies every new binary before installing any; the batch-import bail-out andonboardTOML escaping and legacymigrate_contentare fixed (#1376). uteke upgradeverification no longer fails with "Text file busy" on a freshly written binary (#1338).
Docs
- Benchmark tooling:
make_fast_eval.pyfinds its id list,modal_fanout.pytakesLMEVAL_MODEL_DIR/UTEKE_RELEASE, dataset size corrected (#1374).
Dependencies
- uuid 1.27.0, usearch 2.26.3.
📦 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.20.0.tar.gz |
| Linux x86_64 (Legacy, SSE4.2) | uteke-x86_64-unknown-linux-gnu-legacy-v0.20.0.tar.gz |
| Linux ARM64 | uteke-aarch64-unknown-linux-gnu-v0.20.0.tar.gz |
| macOS Apple Silicon | uteke-aarch64-apple-darwin-v0.20.0.tar.gz |
| Windows x86_64 | uteke-x86_64-pc-windows-msvc-v0.20.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.20.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)