Weave your agents' memories into one searchable fabric — local-first, pluggable, raw-preserving.
Project description
memory-pipeline
Unified agent memory collection + local knowledge base.
Collects memory from multiple AI agents (OpenClaw, Claude Code, Codex, etc.) on local or SSH-reachable hosts, stores them as a raw-preserving data lake (JSON + markdown + SQLite FTS5), and exposes full-text search via a CLI.
Why
Every agent has its own memory. None of them talk to each other. This tool is the bottom layer of a stack that lets you grep/search/retrieve across all of them from one place.
The v0.1 design keeps everything raw — original files are copied (or referenced) to disk in their original form, with derived layers (facts, vector indices, graph relations) added on top later. You can always go back to the source.
v0.4 scope
- Agents (collect): OpenClaw, Claude Code, Codex CLI, LibreChat, Generic JSONL
- Agents (sync/push): OpenCode, Kilo Code, Qoder, Antigravity brain — push local stores to HTTP ingest
- Hosts: local + SSH
- Pipeline: collect → privacy-filter → tag → dedup → persist
- Retrieval: CLI
mp searchover SQLite FTS5 + vector hybrid search - Ingest server: FastAPI
POST /ingestwith Bearer auth, privacy filter, auto-embed
Install
uv sync
# or: pip install -e .
Quick start
# 1. Drop a starter config
mp init-config ./config/memory-pipeline.yaml
# 2. Edit it: pick which agents, which hosts
# 3. Collect once
mp collect
# 4. Search
mp search "memory pipeline"
mp search --source openclaw "Beta preferences"
# 5. Inspect a record
mp inspect rec_abc123...
# 6. Status
mp status
# 7. (Push mode) Sync local agent stores to ingest server
mp sync run ~/.memloom-sync/config.yaml --once
Layout
data/ # data_root from config
raw/<source>/<key>.json # canonical record
raw/<source>/<key>.md # human-readable mirror
index.sqlite # FTS5 over all records
runs.sqlite # collector run history
watermarks.json # incremental cursors
Sync config (push mode)
# ~/.memloom-sync/config.yaml
endpoint: http://192.168.5.101:8789/ingest
api_key: memloom_ingest_xxxxx
batch_size: 500
sources:
- type: opencode
db: ~/.local/share/opencode/opencode.db
- type: kilocode
session_dir: ~/Library/Application Support/Code/User/globalStorage/kilocode.kilo-code/tasks
Cron
scripts/install-cron.sh registers mp collect every 5 minutes in the user's crontab.
Idempotent — re-running picks up only what changed.
Architecture
Agents ──► Collectors ──► Pipeline ──► RawStore
│
└──► (future) Vector index
└──► (future) MCP server
- Collectors: one per agent type. They know the agent's on-disk format and
yield
MemoryRecords. They don't know about persistence. - Transport: pluggable.
LocalTransportfor local files,SSHTransport(Fabric) for remote. Collectors ask the transport to read/list — they don't care which one. - Pipeline: pure transforms on records — privacy filter, tag inference, deduper. Composable.
- RawStore: append-only-ish writes keyed by content hash. Three artifacts per record (json + md + sqlite row). FTS5 index for retrieval.
Adding a new agent
- Subclass
AgentAdapterinmemloom/collectors/your_agent.py. - Implement
discover()(return list ofSource) andpull()(yield(MemoryRecord, Watermark)pairs). - Register in
memloom/collectors/__init__.py:_REGISTRY. - Add a config block under
agents:.
That's it — pipeline + transport + store need zero changes.
Commit message format
We follow Conventional Commits (English, unless otherwise stated). Every commit message must match this format:
<type>(<scope>): <subject> ← ≤72 chars, imperative, no period
[optional body] ← wrap at ~72 chars, explain WHAT and WHY
[optional footer] ← BREAKING CHANGE: or Refs: #123
Types: feat, fix, docs, style, refactor, test, chore,
build, ci, perf, revert. Breaking changes use a ! after the
type/scope (feat(api)!: drop v1 endpoint) or a BREAKING CHANGE: footer.
Scopes (project-specific): collectors, store, pipeline,
transport, vector, mcp, cli, config, docs, deps, ci.
The repo ships with a .gitmessage template and a commit-msg git hook
that enforces the format. To enable the hook after cloning:
./scripts/install-hooks.sh
git config commit.template .gitmessage
Examples:
feat(collectors): add OpenCode adapter
fix(privacy): strip ghp_ tokens from raw_meta
docs: add AnythingLLM integration guide
refactor(store)!: drop legacy v1 schema
chore(deps): bump pydantic to 2.13
Future (architecture already supports it)
- v0.2: GitHub / Feishu / Notion / Email / browser extensions → drop in
collectors under
collectors/saas/. - v0.2: AnythingLLM integration via push to its Custom Embedding API.
- v0.2: MCP server exposing
search_records+get_recordfor OpenClaw. - v0.3: Graph layer (relationships between records, projects, agents).
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 memloom-0.4.2.tar.gz.
File metadata
- Download URL: memloom-0.4.2.tar.gz
- Upload date:
- Size: 180.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b820f0f5c2c4461969af837f863fec0ce97c34658c8e9e00ba511fff207e7c4
|
|
| MD5 |
b042468fc06c2ea4b03fabb2b4d6c44b
|
|
| BLAKE2b-256 |
914aeb158fefd6a1297b3ac8517b20ece1d0be08a24c724679b633a597a35495
|
Provenance
The following attestation bundles were made for memloom-0.4.2.tar.gz:
Publisher:
publish.yml on atbeta/memloom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
memloom-0.4.2.tar.gz -
Subject digest:
9b820f0f5c2c4461969af837f863fec0ce97c34658c8e9e00ba511fff207e7c4 - Sigstore transparency entry: 2194935897
- Sigstore integration time:
-
Permalink:
atbeta/memloom@7d547c3db7358a8d23782ea6e20136544b6b2c7b -
Branch / Tag:
refs/tags/v0.4.2 - Owner: https://github.com/atbeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7d547c3db7358a8d23782ea6e20136544b6b2c7b -
Trigger Event:
push
-
Statement type:
File details
Details for the file memloom-0.4.2-py3-none-any.whl.
File metadata
- Download URL: memloom-0.4.2-py3-none-any.whl
- Upload date:
- Size: 73.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86f1bdcc4a58ca3642b99ca0d3fa3cab4538c58ebdc874463bbef6714735ca65
|
|
| MD5 |
8442ddb271346df8901fbdfaaa78a3dd
|
|
| BLAKE2b-256 |
f0c5b0edeacc78c972d157d4c3ccec8856d8b18d74ca136a840cad695aa5ac2a
|
Provenance
The following attestation bundles were made for memloom-0.4.2-py3-none-any.whl:
Publisher:
publish.yml on atbeta/memloom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
memloom-0.4.2-py3-none-any.whl -
Subject digest:
86f1bdcc4a58ca3642b99ca0d3fa3cab4538c58ebdc874463bbef6714735ca65 - Sigstore transparency entry: 2194935902
- Sigstore integration time:
-
Permalink:
atbeta/memloom@7d547c3db7358a8d23782ea6e20136544b6b2c7b -
Branch / Tag:
refs/tags/v0.4.2 - Owner: https://github.com/atbeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7d547c3db7358a8d23782ea6e20136544b6b2c7b -
Trigger Event:
push
-
Statement type: