EverMem — md-first memory extraction framework (lightweight; single-user or small-team)
Project description
EverMem
md-first memory extraction framework for AI agents — lightweight, single-user or small-team.
What is EverMem
EverMem is an open-source Python framework that turns conversations / workflows / files into structured, retrievable, evolving long-term memory for AI agents. Designed for lightweight local deployments (personal agents, small teams, individual developers), with three core principles:
- Markdown as Source of Truth — All memory persists as plain
.mdfiles. Open, edit, grep, version with Git, view in Obsidian. No black-box database lock-in. - Lightweight three-piece storage —
Markdownfiles (truth) +SQLite(state/queue) +LanceDB(vector + BM25 + scalar). No MongoDB / Elasticsearch / Milvus / Redis / Kafka required. - EverCore as pure algorithm library — Memory extraction algorithms are decoupled into a separate library; this project orchestrates and persists.
Architecture at a glance
┌───────────────────────────────────────────────┐
│ entrypoints/ (CLI + HTTP API) │ presentation
├───────────────────────────────────────────────┤
│ service/ (use cases: memorize/retrieve) │ application
├───────────────────────────────────────────────┤
│ memory/ (extract + search + cascade) │ domain
├───────────────────────────────────────────────┤
│ infra/ (markdown / sqlite / lancedb) │ infrastructure
└───────────────────────────────────────────────┘
↑ ↑
component/ core/
(LLM/Embedding) (observability/lifespan)
DDD 5 layers, single-direction dependency. See docs/architecture.md.
Quick start
Install as a package
uv pip install evermem # or: pip install evermem
# Drop a .env in your working directory.
# OpenAI-protocol compatible — works with OpenAI, OpenRouter, vLLM, Ollama, ...
cat > .env <<'EOF'
# LLM
EVERMEM_LLM__MODEL=gpt-4o-mini
EVERMEM_LLM__API_KEY=sk-...
EVERMEM_LLM__BASE_URL=https://api.openai.com/v1
# Embedding
EVERMEM_EMBEDDING__MODEL=Qwen/Qwen3-Embedding-4B
EVERMEM_EMBEDDING__API_KEY=...
EVERMEM_EMBEDDING__BASE_URL=https://api.deepinfra.com/v1/openai
# Rerank
EVERMEM_RERANK__MODEL=Qwen/Qwen3-Reranker-4B
EVERMEM_RERANK__API_KEY=...
EVERMEM_RERANK__BASE_URL=https://api.deepinfra.com/v1/inference
EOF
evermem --help
evermem server start
For a step-by-step walkthrough (add a conversation → flush → search → read the markdown), see QUICKSTART.md.
Develop locally
git clone <repo>
cd evermem
uv sync # creates ./.venv and installs deps
source .venv/bin/activate # — or skip activation and prefix every command with `uv run`
cp env.template .env # fill in EVERMEM_LLM__API_KEY
evermem --help
make test
Storage layout
~/.evermem/
├── memory/ # Markdown — Single Source of Truth
│ ├── users/<user_id>/
│ │ ├── user.md # profile
│ │ ├── memcells/ # day-level append logs
│ │ ├── episodic/
│ │ └── ...
│ └── agents/<agent_id>/
│ ├── agent.md
│ ├── cases/
│ └── skills/
├── .index/ # LanceDB derived indexes (rebuildable)
└── .system.db # SQLite: state + audit + queue + metadata
Open the memory/ folder in Obsidian — your agent's brain is just files.
Features
- Hybrid retrieval: BM25 + vector (HNSW/IVF-PQ) + scalar filter, single-query in LanceDB
- Cascade index sync: edit a
.md→ file watcher → entry-level diff → LanceDB sync, sub-second - Multi-source extraction: conversations / workflows / agent traces / file knowledge
- Dual-track memory: user-track (Episodes / Profiles) + agent-track (Cases / Skills)
- Async-first: full asyncio, single event loop
- Multi-modal: text + small image / audio inline; large media via S3/OSS reference
Project structure
evermem/ # repo root
├── src/evermem/ # main package (src layout)
│ ├── entrypoints/ # cli + api
│ ├── service/ # use case orchestration
│ ├── memory/ # domain: extract + search + cascade + prompt_slots
│ ├── infra/ # storage: markdown + lancedb + sqlite
│ ├── component/ # cross-cutting: llm / embedding / config / utils
│ ├── core/ # runtime: observability / lifespan / context
│ └── config/ # configuration data + Settings schema
├── tests/ # unit / integration / golden / fixtures
├── docs/ # design docs
├── examples/ # quickstart + chat_agent + obsidian_demo
└── .claude/ # team-shared rules + skills (auto-loaded by Claude Code)
Documentation
- docs/overview.md — Project overview & vision
- docs/architecture.md — DDD layered architecture & dependency rules
- docs/engineering.md — Engineering & dev-efficiency infrastructure (CI / tooling / Claude Code)
- CHANGELOG.md — Release notes
- CONTRIBUTING.md — How to contribute
- .claude/rules/ — Detailed coding conventions (auto-loaded by Claude Code)
Status
Alpha (v0.1.0) — Active development. Core API may change before v1.0.
License
Apache License 2.0 — see NOTICE for third-party attributions.
Citation
If you use EverMem in research, see CITATION.md.
Acknowledgments: This project builds on prior research and tooling — see ACKNOWLEDGMENTS.md.
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 evermem-0.1.0rc2.tar.gz.
File metadata
- Download URL: evermem-0.1.0rc2.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35b2b753903d3e894813079ebfae26ba1e24e16b9165fb41694846a762def8c6
|
|
| MD5 |
f029e716007f145f9095133393692b39
|
|
| BLAKE2b-256 |
2ffe09445115b9bdab674b8522265d6090c9eabe2e71e4c81e55a82b60712f7d
|
File details
Details for the file evermem-0.1.0rc2-py3-none-any.whl.
File metadata
- Download URL: evermem-0.1.0rc2-py3-none-any.whl
- Upload date:
- Size: 384.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95982c895f318debfd345c21d9c5d58a718b00d1fd9e064cf00d7b22b5096417
|
|
| MD5 |
7b9e80e0699ab5490746218799982bcb
|
|
| BLAKE2b-256 |
b1d3cb7906ae83d97944f4985cea27b144a4fc979e34105a0343b3bfff780cce
|