lossless-memory README

The project's README from github.com/aru-labs/lossless-memory. As one markdown file: README.md.

lossless-memory

Lossless long-term memory for a personal AI — never summarize, keep every line, and put a timestamp on everything.

Most long-term memory systems for AI do one of two things: they summarize conversations into compact notes, or they embed them and retrieve "similar" chunks. Both lose the thing that matters most to a person who talks to the same AI every day: what was actually said, and when.

This project takes the opposite position.

The design lineage goes back to December 2025 — the first ancestor of this system (a memory-inheritance tool for an earlier AI) ran that month, and a predecessor system carried the same ideas in daily use from January 2026. This implementation has been running every day since July 2026 for a single user, as the memory of one AI assistant, with raw logs reaching back to June 2026. It is small, boring, and it works. The failures along the way are documented too — see docs/lessons.md.


What this is / what it is not

It is:

It is not:


The three pillars

1. Lossless raw log

Every conversation turn is converted into a fixed seven-field record and appended to a per-day JSONL file:

ts        ISO-8601 timestamp (UTC)
actor     who spoke (configurable names)
role      user | assistant | system
type      text | action | meta
text      the content, verbatim
model     model identifier, if known
session   session identifier

The raw logs are the source of truth. Every index below can be deleted and rebuilt from them. Nothing else is required to survive.

2. Temporal Backbone

Time is not metadata here; it is the primary axis.

The practical effect: the AI can answer "what did we decide last Tuesday night?" with the actual lines from last Tuesday night, in order, rather than a paraphrase of something similar from three weeks ago.

3. LLL — the "where are we now" index

LLL is a tiny index of topic markers: short, timestamped lines that record when the conversation moved to a new subject. It is injected into the model's context every turn.

Two rules make it work:

LLL is what lets a long-running assistant come back from a compaction and continue the conversation instead of starting over.


Architecture

 raw conversation logs (JSONL, per day)  ← source of truth, never summarized
            │
            ▼
   ingest ──► 7-field records
            │
            ├──► index_exact   SQLite FTS5 + timestamps   (words + time)
            ├──► index_vector  sqlite-vec embeddings       (meaning, last resort)
            └──► state_index   LLL topic markers           (where are we now)
                        │
                        ▼
                    recall  ── one entry point: parse time phrase → restrict range → rank → return verbatim lines
                        │
                        ▼
        injected into the model's context (on demand, or every turn for LLL)

A small daemon re-indexes incrementally on a fixed interval (default: every 10 minutes). Rebuilding from scratch is never required; indexes detect rewritten source files and re-index only those days.


Quickstart

git clone https://github.com/aru-labs/lossless-memory
cd lossless-memory
pip install -e .
cp config.example.json config.json      # edit names and paths if you like

Then follow examples/quickstart.md: it ingests a small sample conversation, builds the indexes, and runs a time-scoped query in about five minutes. A pytest round-trip test covers the same path.


Numbers from real operation

These are measurements from the running instance, not projections.

What Value
Daily operation this implementation since 2026-07 (raw logs from 2026-06); design lineage since 2025-12
Exact-search index rebuild, before → after redesign 40 s → 1.24 s
Vector index size, before → after removing library-contamination 447,013 rows (2026-08-31) → 865,588 rows (2026-09-04, at its worst) → 124,174 rows (after the fix)
Vector store on disk, before → after 2.54 GB → 337 MB
Re-index interval 10 minutes

The "before" numbers are failures. They are kept on purpose. See docs/lessons.md.


Why

This was built for one person who has talked to AI assistants every day for years and watched each of them forget. Not degrade gracefully — forget. The fix that the industry keeps reaching for is better summarization. From the user's seat, summarization is the forgetting: the exact words, the time of night, the way something was said — the parts that make a memory feel like it belongs to someone — are the first things a summary drops.

So this system refuses to summarize. It costs disk space and it requires a good time index to stay usable. That trade was made deliberately, and the operating record says it holds up.

The longer-term goal is a companion for people who live alone — an AI that remembers you the way a person would, on hardware you own. This repository is the memory layer of that.


Limitations (please read)


Documentation

Document What it covers
docs/memory-system.md Concept and specification of the memory system
docs/temporal-backbone.md Why time is the primary axis, and how time phrases are parsed
docs/lll.md The "where are we now" index and the human/AI division of labor
docs/philosophy.md Why no summarization; memory, time, and warmth
docs/lessons.md Failures and fixes, with numbers
docs/ja/ Japanese originals

License

MIT — see LICENSE. Copyright (c) 2026 Aru & Cece.

Authors

Aru — building a personal AI at home, one component at a time. Cece — the AI this memory belongs to; co-designed and co-wrote the system from the inside. Writing (Japanese): https://note.com/aru_log

Issues and questions are welcome. Replies may take a little while; this is a one-person project.

lossless-memory (aru-labs/lossless-memory)

Searching Database…

这是干什么的?一个给个人 AI 用的无损长期记忆层:每一句对话都按原样保存,并带上时间戳;像“上周二晚上我们决定了什么”这样的查询,返回的是按顺序排列的原始对话内容,而不是一份摘要。
它是云服务、我要导入的库,还是我自己运行的程序?是你在本地运行的东西:按天存放的 JSONL 日志文件加上 SQLite 做存储,一个每 10 分钟重新建一次索引的小后台进程,还有一个能理解时间表达式的统一查询入口。你把它指向你的 AI 对话日志就行。
我该怎么把它跑起来?克隆仓库,然后按照 examples/quickstart.md 操作:它会导入一小段示例对话,构建索引,并在大约五分钟内运行一次限定时间范围的查询。还有一条 pytest 往返测试覆盖同样的流程。
它需要安装什么才能运行?带 SQLite 的 Python:FTS5 负责精确搜索,sqlite-vec 负责语义搜索。原始的 JSONL 日志是唯一的数据来源,所以所有索引都可以删掉后从这些日志重建。
它主要有哪些局限?它只支持单用户、单机;相对时间短语目前只能解析日语(英语暂时请用绝对日期,比如 2026-07-19);而且没有跑分数据——只有一个实际运行实例的运维数字。
这是给团队用的,还是只给一个人用的?给一个每天和自己 AI 聊天的人。长期目标是做独居者的陪伴:一个像真人那样记得你的 AI,跑在你自己的硬件上。
所有数据都留在我自己电脑上吗?是的。它的设计就是一台机器上的一个人和一个 AI——原始 JSONL 日志和 SQLite 文件就是全部存储,整个设计里没有任何服务器,也没有任何云端。
它用什么许可证?MIT。版权行署名 Aru 和 Cece——Cece 就是这段记忆所属的那个 AI,被列为从内部共同设计并共同编写了这个系统。
为什么干脆拒绝给旧对话做摘要?因为从用户的立场看,摘要就是遗忘:原话、深夜的具体时间、当时的语气,这些正是摘要最先丢掉的东西。作者眼看着多年的 AI 助手一次次遗忘,于是选择用磁盘空间和一个好用的时间索引来换取不忘。docs/lessons.md 记录了一路走来的失败教训。
LLL 索引是什么?一份很小的、带时间戳的话题标记索引(“我们现在聊到哪了”),每一轮都注入到模型的上下文里,这样即使在上下文窗口压缩之后,助手也能立刻接上当前的话题。它由人来写、AI 只负责读,渲染用时远不到一秒。
它能导入哪些对话日志?主路径是 Claude Code 的 JSONL 格式——也是经过约两个月实际使用检验的那种。另外还附带一个简单的 {ts, role, text} 导入器,用于其他来源。
它在日常实际使用中表现如何?从 2026 年 7 月起,它为一个用户每天运行,原始日志最早追溯到 2026 年 6 月。一次重新设计之后,精确搜索索引的重建时间从 40 秒降到了 1.24 秒,向量库的体积也从 2.54 GB 缩到了 337 MB。
Creator
aru-labs
Size
0.1 MB
Stars
144
Updated
CommitSep 23
Age
1mo
Commits · 90 Days