Persistent, queryable AI memory for any Python app — local-first, zero API cost
Project description
memoryos
Persistent, queryable memory for any Python AI app — local-first, zero API cost.
What is it?
memoryos gives any AI app a long-term memory layer — without needing an API key, a cloud service, or a database server.
Store things. Recall them semantically. Forget them. All locally.
from memoryos import Memory
mem = Memory(user_id="arjun")
mem.remember("I prefer dark mode and use VS Code")
mem.remember("Currently building a job application assistant")
mem.remember("I like concise answers over long explanations")
results = mem.recall("what tools does the user prefer?")
for r in results:
print(f"[{r['score']:.3f}] {r['text']}")
[0.412] I prefer dark mode and use VS Code
[0.289] I like concise answers over long explanations
CLI Demo
Stats
Install
pip install memoryos-official
Features
- Semantic recall — finds memories by meaning, not exact keywords
- Memory decay — old memories fade in relevance automatically
- Importance scoring — weight memories by how significant they are
- Tags — organize memories into namespaces
- Forget & clear — GDPR-friendly deletion
- Local-first — uses FAISS + SQLite, no external services
- Zero cost — no API keys, no cloud, runs on your machine
API Reference
Memory(user_id, db_path)
mem = Memory(user_id="alice", db_path="memory.db")
| Param | Default | Description |
|---|---|---|
user_id |
"default" |
Isolates memories per user |
db_path |
"memory.db" |
SQLite file path. Use ":memory:" for in-RAM (tests) |
remember(text, tags, importance, decay_days)
Store a memory.
mid = mem.remember(
"User just got promoted to SDE-2",
tags=["career", "milestone"],
importance=0.9, # 0.0–1.0, default 0.5
decay_days=90, # score halves every 90 days, 0 = no decay
)
Returns: str — the memory ID (use it to forget() later)
recall(query, top_k)
Find the most semantically relevant memories.
results = mem.recall("what is the user's job status?", top_k=3)
# [{"id": ..., "text": ..., "score": 0.87, "tags": [...], ...}]
forget(memory_id)
Delete a specific memory.
mem.forget(mid)
clear()
Wipe all memories for this user.
mem.clear()
export(filepath)
Backup all memories to JSON.
mem.export("my_memories.json")
How it works
remember()→ text is embedded usingsentence-transformers(all-MiniLM-L6-v2, runs locally) → vector stored in FAISS, metadata in SQLiterecall()→ query is embedded → FAISS finds top-k nearest vectors → SQLite returns the original text- Scoring → final score = cosine similarity × (0.7 + 0.3 × decayed importance)
Why not mem0 / Zep / etc.?
| memoryos | mem0 | Zep | |
|---|---|---|---|
| Local-first | ✅ | ❌ | ❌ |
| API key needed | ❌ | ✅ | ✅ |
| Cost | Free | Paid tiers | Paid tiers |
| Memory decay | ✅ | ❌ | ❌ |
pip install |
✅ | ✅ | ✅ |
Stack
sentence-transformers— local text embeddingsfaiss-cpu— vector similarity searchsqlite3— metadata storage (built into Python)
License
MIT © Devarajan
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file retainr-0.2.0.tar.gz.
File metadata
- Download URL: retainr-0.2.0.tar.gz
- Upload date:
- Size: 204.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
885638d9b7f93ee7dc74c7119e22d6ecef8fc26dd65da3245dedf97ed1bb9fdd
|
|
| MD5 |
ceafc3f5aa22dfb20cc83259dc20c511
|
|
| BLAKE2b-256 |
ba1912ec2a2662b5587a9c95223cc3bb444d46a2b52fd387e0ccaa963045e179
|
File details
Details for the file retainr-0.2.0-py3-none-any.whl.
File metadata
- Download URL: retainr-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00e88052492bb485f6e5b33e023c67fc9c26dae9680585c421c90730207dab10
|
|
| MD5 |
bb6f5a38397939b79b3e48997fb4debc
|
|
| BLAKE2b-256 |
9b86f9120e4b2fbc8c72b0b1fd4d5d938efc6d1bd734df8418100e5f08516dba
|