Last Sunday, a Hacker News post argued that agent memory belongs in plain files. 190 points and 94 comments in two days. For a topic as unglamorous as "save notes to a text file," that is a lot of heat.
We agreed with the thread, because we had already shipped the thing it asked for. Uteke is a semantic memory engine for AI agents: one Rust binary, one SQLite file on your machine, recall in about 45 milliseconds, fully offline.
What the thread got right
Cal Paterson's argument: most agent memory systems are broken. Some lock you into a vendor. Some are absurdly heavy: pgvector, a graph database, and a separate LLM whose only job is deciding what deserves to be remembered. His fix is memory as data: markdown pages in a zip, plus an optional SQLite file for search.
Files are inspectable. You can cat a memory, diff two of them, put the directory in git. No vendor can deprecate your zip file.
Where plain files stop
Store "we deploy v2.1 to staging after the payment freeze" on a Tuesday. Three weeks later you ask your agent "when are we shipping?" Grep finds nothing, because the words "ship" and "release" never appear in the file. Grep does not do meaning. At five memories that is a curiosity. At five hundred, roughly two weeks of real agent work, it is the difference between memory and an archive.
So we built the file that answers questions.
What Uteke does
curl -sSL codecora.dev/uteke/install | sh
uteke remember "Deploy v2.1 to staging at 3pm"
uteke recall "when do we deploy?"
That third command is the one files cannot do. Recall runs hybrid search: SQLite FTS5 for keywords, vector similarity for meaning, fused into one ranked list. A local embedding model (about 188MB) downloads once. After that, nothing leaves your machine.
Numbers we publish:
- 98.2% recall_any@5 on LongMemEval-S (500 questions, zero-config fusion default, public harness in the repo)
- 42ms P50 / 50ms P95 recall at 10K memories, and latency stays flat from 100 to 10K
Uteke is Apache-2.0. The repo sits at 237 stars.
If you nodded along with that thread, those three commands are the whole evaluation. Your agent's memory stays a file you own. The file just answers questions now.
The full story is on the blog: Agent memory should be a file. We built it.
This article is crossposted with blog.codecora.dev as the canonical source.