Fractal memory system for Claude Code
Project description
Oubli
Oubli: French for "forgetting." (Also a West African fruit so sweet it makes babies forget their mother's milk.)
A memory system that never forgets. Persistent fractal memory for Claude Code.
Features
- Hybrid Search - Combines BM25 keyword search + semantic embeddings for intelligent retrieval
- Core Memory - Essential facts about you (~2K tokens), loaded in every conversation
- Fractal Synthesis - Raw memories consolidate into higher-level insights automatically
- Duplicate Merging - Similar memories merged during synthesis (85% Jaccard threshold)
- Proactive Memory - Claude searches and saves automatically, no prompting needed
- Immediate Updates - Family, work, and identity changes update Core Memory instantly
- Quiet Operation - Memory operations happen silently in the background
- Local-First - All data stays on your machine, no external services
Installation
pip install oubli
oubli setup
Then restart Claude Code. The embedding model (~80MB) downloads on first use.
Requirements
- Python 3.10+
- Claude Code CLI installed
Uninstall
oubli uninstall
pip uninstall oubli
How It Works
Memory Hierarchy
┌─────────────────────────────────────────┐
│ CORE MEMORY │
│ (~2K tokens, always in context) │
│ │
│ Identity, family, work, preferences │
└─────────────────────┬───────────────────┘
│ synthesized from
▼
Level 2 ○ "Deeply technical, values efficiency"
╲
Level 1 ○ ○ "Loves jazz fusion" "Python expert"
╲│
Level 0 ○○○○ Raw memories with full conversation text
- Core Memory: Always loaded. The essential "you" - identity, family, work, key preferences.
- Level 0: Raw memories from conversations with full context.
- Level 1+: Synthesized insights combining multiple raw memories.
Hybrid Search
Oubli uses LanceDB's hybrid search combining:
- BM25 Full-Text Search - Finds keyword matches
- Semantic Embeddings - Finds conceptually related content (via sentence-transformers)
- RRF Reranking - Merges both result sets intelligently
Example: Searching "jazz music" finds memories about "Pat Metheny" and "fusion harmonies" even without exact keyword matches.
Synthesis Workflow
When you have 5+ unsynthesized Level 0 memories, Claude automatically runs /synthesize:
- Merge duplicates - Similar memories at each level are combined
- Group by topic - Related memories clustered together
- Create insights - Level 1+ memories synthesize the patterns
- Update Core Memory - Regenerated from highest-level insights
Nothing is lost - you can always drill down from a synthesis to its source memories.
Usage
Natural Interaction
Just talk naturally. Claude handles memory operations silently:
- "I prefer TypeScript over JavaScript" → Saved automatically
- "What do you know about my work?" → Searches memory
- "I no longer work at Spotify" → Deletes old, saves new, updates Core Memory
Import Existing Memories
Paste your Claude.ai memory export and ask:
"Import this into my memory"
Claude parses it into structured memories and optionally creates your Core Memory.
Slash Commands
/synthesize- Run full synthesis: merge duplicates, create insights, update Core Memory/clear-memories- Clear all memories (requires confirmation)
Data Storage
All data stored locally in ~/.oubli/:
| File | Description |
|---|---|
memories.lance/ |
LanceDB database with vector embeddings |
core_memory.md |
Your Core Memory (human-readable, editable) |
What Gets Installed
| Component | Location | Description |
|---|---|---|
| MCP Server | claude mcp |
15 memory tools |
| Hooks | ~/.claude/settings.json |
UserPromptSubmit, PreCompact, Stop |
| Commands | ~/.claude/commands/ |
/clear-memories, /synthesize |
| Instructions | ~/.claude/CLAUDE.md |
How Claude uses the memory system |
MCP Tools
Retrieval
| Tool | Description |
|---|---|
memory_search |
Hybrid search (BM25 + semantic) |
memory_get |
Get full details including conversation text |
memory_get_parents |
Drill down from synthesis to source memories |
memory_list |
List memories by level |
memory_stats |
Get memory statistics |
Storage
| Tool | Description |
|---|---|
memory_save |
Save a new memory (auto-embeds) |
memory_import |
Bulk import memories |
memory_update |
Update an existing memory |
memory_delete |
Delete a memory |
Synthesis
| Tool | Description |
|---|---|
memory_synthesis_needed |
Check if synthesis should run (threshold: 5) |
memory_prepare_synthesis |
Merge duplicates, return groups for synthesis |
memory_synthesize |
Create Level 1+ insight from parent memories |
memory_dedupe |
Manual duplicate cleanup |
Core Memory
| Tool | Description |
|---|---|
core_memory_get |
Get Core Memory content |
core_memory_save |
Save Core Memory content |
Development
git clone https://github.com/dremok/oubli.git
cd oubli
pip install -e .
oubli setup
# Test storage
python -c "
from oubli.storage import MemoryStore
store = MemoryStore()
print('Embeddings:', store.embeddings_enabled())
store.add(summary='Test memory', topics=['test'])
print(store.search('test'))
"
License
MIT
Project details
Release history Release notifications | RSS feed
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 oubli-0.2.2.tar.gz.
File metadata
- Download URL: oubli-0.2.2.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b078178e3b5395f98735bffe418e1e0eb0d3cfa5c9e111761efd1b929f558042
|
|
| MD5 |
e85ae51b1068178877f520be254cb907
|
|
| BLAKE2b-256 |
19250be045520897d5f866cde0f196e02d689170095e2d07e392f1e464400374
|
File details
Details for the file oubli-0.2.2-py3-none-any.whl.
File metadata
- Download URL: oubli-0.2.2-py3-none-any.whl
- Upload date:
- Size: 23.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
653dda5d6be69c01306aa600a2a3a0dd916000d81ca737d761b8ae0f7eba611b
|
|
| MD5 |
fcba1d5e365b58be4dc2ea57d2efbc36
|
|
| BLAKE2b-256 |
94010118c77a03a1e7c14fe8f259614872ab4cf035860b96d6c10633d1a3d29f
|