Skip to main content

Fractal memory system for Claude Code

Project description

Oubli

image



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

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:

  1. Merge duplicates - Similar memories at each level are combined
  2. Group by topic - Related memories clustered together
  3. Create insights - Level 1+ memories synthesize the patterns
  4. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oubli-0.2.2.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oubli-0.2.2-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

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

Hashes for oubli-0.2.2.tar.gz
Algorithm Hash digest
SHA256 b078178e3b5395f98735bffe418e1e0eb0d3cfa5c9e111761efd1b929f558042
MD5 e85ae51b1068178877f520be254cb907
BLAKE2b-256 19250be045520897d5f866cde0f196e02d689170095e2d07e392f1e464400374

See more details on using hashes here.

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

Hashes for oubli-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 653dda5d6be69c01306aa600a2a3a0dd916000d81ca737d761b8ae0f7eba611b
MD5 fcba1d5e365b58be4dc2ea57d2efbc36
BLAKE2b-256 94010118c77a03a1e7c14fe8f259614872ab4cf035860b96d6c10633d1a3d29f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page