Generated banner for memU
Generated logo for memU

memU

Memory framework

First committed by evan-ak

Published in NevaMind-AI/memU. Publisher page

14,613 GitHub stars

What it is

Personal memory across agents
— the description by evan-ak

AutoGineer overview, from the brain’s own files

memU is an agent-driven memory system designed to provide persistent knowledge across different AI agents, sessions, and devices. It functions as a sidecar to desktop coding agents, automatically mining session logs to extract reusable skills and workflows. These skills are stored as Markdown files, which the agent can then retrieve and apply to future tasks. The system is designed to be storage-agnostic, supporting local SQLite databases for single-device use or Postgres for concurrent access, and it integrates with various coding agents through dedicated host adapters.

How it works

Memory model: LLM wiki

AutoGineer overview, from the brain’s own files

memU operates by installing a scheduled background task that monitors agent session logs. It slices these logs into jobs, which the agent then processes to create or update Markdown-based skill files. These skills are indexed and stored in a configured backend. When an agent performs a task, it uses a standing instruction to trigger a retrieval process, which fetches relevant skills from the memory store and injects them into the agent's context.

Folders
FolderRoleFiles
.githubagent-config10
assetsattachments24
docsdocs25
scriptsscripts1
srcsource-code190
teststests69
npmfolder3

The agent reads

The agent writes

Requirements

Runtimes: Python >=3.11

Databases: PostgreSQL, SQLite

API keys (by name): MEMU_API_KEY, OPENAI_API_KEY

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)

Set it up

  1. This brain runs code automatically: 4 scripts. Review Makefile, src/memu/hosts/claude_code/install.py, src/memu/hosts/codex/install.py, src/memu/hosts/pi/install.py before opening the folder in Claude Code. No step below turns a hook on for you.

    • Makefile: echo "🚀 Creating virtual environment using uv"; uv sync; uv run pre-commit install
    • src/memu/hosts/claude_code/install.py: python src/memu/hosts/claude_code/install.py
    • src/memu/hosts/codex/install.py: python src/memu/hosts/codex/install.py
    • src/memu/hosts/pi/install.py: python src/memu/hosts/pi/install.py
  2. Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (7 declared). https://pypi.org/project/memu-cli/
  3. First committed by evan-ak. Published in NevaMind-AI/memU. Licence: Apache License 2.0.

Usage

AutoGineer overview, from the brain’s own files

  • Install memU via the provided CLI or agent-specific instructions.
  • Configure the memory backend using a local SQLite file or a Postgres DSN.
  • Allow the background task to automatically distill agent history into Markdown skills.
  • Use the agent's integrated retrieval mechanism to access relevant past skills during new tasks.
  • Manage memory settings and storage via the memU CLI or environment variables.
  • Use the doctor command to verify the configuration and retrieval path.
“memu-codex retrieve "What should I remember about this project?"”
The system returns relevant memory hits containing text, descriptions, and paths from previous sessions.
“memu-agent detect”
The system probes the machine to identify the agent and reports if memorization and retrieval are supported.

Documentation by evan-ak

Image: memU Banner

<div align="center">

memU

Personal memory, stored as Wiki

Across Sessions. Across Agents. Across Devices.

Image: PyPI version Image: License: Apache 2.0 Image: Python 3.11+ Image: Discord Image: Twitter

<a href="https://trendshift.io/repositories/17374" target="_blank"><img src="https://trendshift.io/api/badge/repositories/17374" alt="NevaMind-AI%2FmemU | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>

</div>


memU is a lightweight, agent-driven memory system that gives users a shared LLM wiki across sessions, agents, and devices. It automatically distills your own reusable skills from your agent history. Its core memory logic is only 500 lines — compact enough to inspect, understand, and adapt.

Quick start

memU works with Codex, Claude Code, Cursor, OpenClaw, Hermes, WorkBuddy, Cola, pi, and more. See Host adapters.

Cross-device · Free · Unlimited · View online

Get your API key from memu.so, then send this message to your agent:

Read https://memu.pro/SKILL.md, follow its instructions to install and configure memU, API Key is memu_•••••••••(get Api Key from memu.so).

Agent support

This matrix lists the currently tested memU integrations by operating system.

  • Memorize — capture useful session knowledge through a scheduled background task and turn it into reusable memory.

  • Retrieve — bring relevant memory into a future task.

  • ⚠️ — supported with an important limitation; see the user note.

macOS
AgentModeMemorizeRetrieveUser note
ChatGPTChatGPT(Work mode), codex and VS Code extension✅✅
ChatGPTChat❌❌Chat mode is not currently supported. Please use Work mode.
Claude CodeDesktop and CLI✅✅If the selected model declines the setup steps, retry with Opus or another model. Sonnet 5 can occasionally do this.
ClaudeChat and Cowork❌❌
Cursor—✅✅
OpenClaw—✅✅Retrieve support has not yet been verified.
Hermes Agent—✅✅
WorkBuddy—✅✅
Windows
AgentModeMemorizeRetrieveUser note
ChatGPTChatGPT(Work mode), codex and VS Code extension✅✅
ChatGPTChat❌❌Chat mode is not currently supported. Please use Work mode.
Claude CodeDesktop and CLI✅✅If the selected model declines the setup steps, retry with Opus or another model. Sonnet 5 can occasionally do this.
ClaudeChat and Cowork❌❌
Cursor—✅✅
OpenClaw—✅✅
Hermes Agent—✅⚠️Use a memU version with Windows HERMES_HOME support; older versions may retrieve from the wrong files.
WorkBuddy—✅✅With Hy3, retrieval may fail. Retry with another model if this happens.
Linux
AgentModeMemorizeRetrieveUser note
CodexVS Code extension❌✅
Claude CodeCLI✅✅
OpenClaw4.23 / 7.1✅✅

Support status reflects the current release and may change as host integrations evolve.

How it works

Image: memU memory system architecture

Automatic skill extraction

Once the scheduled bridging task is installed, memU can turn useful agent history into reusable Markdown skills automatically.

Image: How memU turns agent history into reusable skills

  1. Capture new sessions. The host adapter reads new session history, including messages and tool calls.

  2. Prepare self-evolve jobs. prepare slices each session into a self-contained job with the paths and context the agent needs.

  3. Let the agent decide. The agent reads related existing skills, then chooses to do nothing, patch an existing skill, or create a new one.

  4. Write readable skill Markdown. Each skill has a name, description, and reusable workflow, including useful branches, edge cases, and pitfalls.

  5. Commit and index. commit submits changed skill files through commit_results; memU embeds the skill name and description and stores it under the skill track.

  6. Retrieve it later. On a similar future task, memU returns the relevant skill so any connected agent can use the learned workflow.

The judgment and synthesis stay inside the agent. MemoryService makes no LLM or chat calls; it stores, embeds, and retrieves the skill Markdown the agent prepared.

Self-hosted

Private · Single-device · Embedding key required

To run memU locally with your own storage and embedding provider, send this message to your agent:

Read https://raw.githubusercontent.com/NevaMind-AI/MemU/main/SKILL.md and follow it to install memU.

Uninstall

To uninstall memU, send this message to your agent:

Read https://memu.pro/SKILL.md and follow its instructions to uninstall memU.

By default, uninstalling removes the host integration and tooling while keeping your memory store and ~/.memu/config.env, so a later reinstall can resume where you left off. Memory is erased only when you explicitly ask for it.

Host adapters: memory for desktop coding agents

memU runs as a sidecar to a desktop agent, one binary per host. Each binds two seams:

  • record — a scheduled bridging task slices new session logs into self-contained job files; the agent itself distills them into memory/skill Markdown; commit submits whatever the agent left on disk back through commit_results.

  • inject — a standing instruction in the host's instruction file tells the agent to run <binary> retrieve (→ progressive_retrieve) before answering.

HostBinarySession log it minesInstruction file it patches
Codexmemu-codex~/.codex/sessions/**/*.jsonl~/.codex/AGENTS.md
Claude Codememu-claude-code~/.claude/projects/<project>/<session>.jsonl~/.claude/CLAUDE.md
Cursor (Agent/CLI)memu-cursor~/.cursor/projects/<project>/agent-transcripts/**.jsonl./AGENTS.md (per project)
OpenClawmemu-openclaw~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite (SQLite, read-only) + legacy <agentId>/sessions/*.jsonl~/.openclaw/workspace/AGENTS.md
Hermes Agentmemu-hermes~/.hermes/state.db (SQLite, read-only)~/.hermes/SOUL.md
WorkBuddymemu-workbuddy~/.workbuddy/projects/<project>/<session>.jsonl~/.workbuddy/SOUL.md
Colamemu-cola~/.cola/sessions/<scope>/<session>.jsonl~/.cola/memory-bank/MEMORY.md
pimemu-pi~/.pi/agent/sessions/<encoded-cwd>/<session>.jsonl~/.pi/agent/AGENTS.md
any other agentmemu-agentfound by memu-agent detect (JSONL dialect sniffed)found by detect (AGENTS.md / CLAUDE.md / SOUL.md / …)

For agents without a dedicated binary, memu-agent detect probes the machine and reports per agent whether memorization works (a recognizable session log exists) and whether retrieval works (an instruction file exists to patch) — then the same verbs run against what it found.

All hosts share one configured memory backend via ~/.memu/config.env — local or MemU Cloud. What one host's sessions taught memU, another host retrieves.

Installation is the one-message setup in Quick start or Self-hosted. SKILL.md is the routing skill it hands your agent: install the package, identify which host you are (falling back to memu-agent detect for anything without a dedicated adapter), print that host's packaged install guide (<binary> docs install), and follow it — configure the memory backend, register the scheduled bridging task, patch the instruction file, each step behind a verify gate — then report which seams (memorization / retrieval) are now active.

Afterwards <binary> doctor proves the whole loop resolves: config, selected mode, and a live retrieval.

Adding another host means implementing one TranscriptSource (where its session logs live, how its records are shaped) plus a HostSpec-sized CLI — the pipeline, verbs, and instruction text are shared.

Developer integration

Use memu memorize to turn application-owned conversations into memory and skills.

CLI

With memU Cloud, sign in at memu.so to view your memory files. With a local installation, memory lives in the shared store configured by MEMU_DB in ~/.memu/config.env — typically ~/.memu/memu.sqlite3 for local SQLite, or a Postgres DSN.

Once installed, your agent retrieves relevant memory automatically before answering. To retrieve manually, run the adapter for your host:

memu-codex retrieve "What should I remember about this project?"
# or: memu-claude-code / memu-cursor / memu-openclaw / memu-hermes / memu-workbuddy / memu-cola / memu-pi / memu-agent

For pi, run memu-pi install to configure the memory backend and install the extension, then run /reload or open a new session. Submitted prompts start retrieval in the background; results enter the model context and resume an idle agent. After the user turn and pending retrieval settle, a background worker processes the saved conversation into memory using the active session's model. Workers share a lock and a 30-minute cooldown. Long prompts use an isolated, tool-free pi request to extract a search query with the active provider/model; extraction has a 12-second timeout and falls back to the original prefix. The installer registers and verifies the extension. Run memu-pi uninstall and reload to remove it.

Host retrieval returns compact JSON with at most five self-contained hits plus independent resources. Each hit combines matched text with its source's description, track, and local mirror path (or inline content when no mirror is available). Its score describes the matched segment; created_at and updated_at describe the source file when available. Hits retain segment order, including excerpts whose source is missing; sources without matched excerpts remain source-only hits. Resources contain path, caption, and available scores/timestamps. Database IDs and scope metadata are omitted from the agent-facing output.

Install or invoke the CLI directly:

pip install memu-cli         # library + memu + memu-codex CLIs
npx memu-cli --help          # CLI via npm launcher (engine: PyPI package memu-cli)
uvx --from memu-cli memu     # CLI via uv, no install

Configuration

Values resolve in order: process env → ~/.memu/config.env → default. memU supports Local and Cloud memory backends, selected by MEMU_MEMORY_MODE; an unset mode remains Local for backward compatibility.

For Local / self-hosted installations, every CLI flag has a matching variable:

SettingEnv varDefault
StoreMEMU_DB./data/memu.sqlite3 (CLI); required for host adapters
Embedding providerMEMU_EMBED_PROVIDERopenai (also: jina, voyage, doubao, openrouter); legacy MEMU_LLM_PROVIDER still read
API keyMEMU_API_KEYthe provider's env var, e.g. OPENAI_API_KEY
Embedding modelMEMU_EMBED_MODELthe provider's default
Base URLMEMU_BASE_URLthe provider's default

Run <binary> doctor to display the resolved mode and verify the same retrieval path the host uses.

Storage backends
ProviderDSNVector searchUse for
inmemory—brute-force cosinetests, throwaway sessions
sqlitesqlite:///path.sqlite3brute-force cosinelocal/default, single writer
postgrespostgresql://...pgvectorconcurrent access, large stores (pip install "memu-cli[postgres]")
service = MemoryService(
    database_config={"metadata_store": {"provider": "postgres", "dsn": "postgresql://..."}},
    embedding_profiles={"default": {"provider": "jina"}},
)

Community contributions

Explore the community tasks (English / 简体中文) and claim a task in issue #790. Each task has a stable link, a difficulty rating, and acceptance criteria. See CONTRIBUTING.md for development and PR guidelines.

License

Apache-2.0

<sub>Partnership Community: <a href="https://linux.do">LINUX DO</a></sub>

docs/sqlite.md

SQLite Database Integration

MemU supports SQLite as a lightweight, file-based database backend for memory storage. This is ideal for:

  • Local development and testing

  • Single-user applications with persistent storage

  • Portable deployments where you need a simple database solution

  • Offline-capable applications that can't rely on external databases

Quick Start

Basic Configuration
from memu.app import MemoryService

# Using default SQLite file (memu.db in current directory)
service = MemoryService(
    llm_profiles={"default": {"api_key": "your-api-key"}},
    database_config={
        "metadata_store": {
            "provider": "sqlite",
        },
    },
)

# Or specify a custom database path
service = MemoryService(
    llm_profiles={"default": {"api_key": "your-api-key"}},
    database_config={
        "metadata_store": {
            "provider": "sqlite",
            "dsn": "sqlite:///path/to/your/memory.db",
        },
    },
)
In-Memory SQLite (No Persistence)

For testing or temporary storage, you can use an in-memory SQLite database:

service = MemoryService(
    llm_profiles={"default": {"api_key": "your-api-key"}},
    database_config={
        "metadata_store": {
            "provider": "sqlite",
            "dsn": "sqlite:///:memory:",
        },
    },
)

Configuration Options

OptionTypeDefaultDescription
providerstr"inmemory"Set to "sqlite" to use SQLite backend
dsnstr"sqlite:///memu.db"SQLite connection string
DSN Format

SQLite DSN follows this format:

  • File-based: sqlite:///path/to/database.db

  • In-memory: sqlite:///:memory:

  • Relative path: sqlite:///./data/memu.db

  • Absolute path: sqlite:////home/user/data/memu.db (note the 4 slashes)

SQLite doesn't have native vector support like PostgreSQL's pgvector. MemU uses brute-force cosine similarity for vector search when using SQLite:

service = MemoryService(
    llm_profiles={"default": {"api_key": "your-api-key"}},
    database_config={
        "metadata_store": {
            "provider": "sqlite",
            "dsn": "sqlite:///memu.db",
        },
        "vector_index": {
            "provider": "bruteforce",  # This is the default for SQLite
        },
    },
)

Note: Brute-force search loads all embeddings into memory and computes similarity for each. This works well for moderate dataset sizes (up to ~100k items) but may be slow for larger datasets.

Database Schema

SQLite creates the following tables automatically:

  • sqlite_resources - Multimodal resource records (images, documents, etc.)

  • sqlite_memory_items - Extracted memory items with embeddings

  • sqlite_memory_categories - Memory categories with summaries

  • sqlite_category_items - Relationships between items and categories

Embeddings are stored as JSON-serialized text in SQLite since there's no native vector type.

Data Import/Export

Export Data

You can export your SQLite database for backup or migration:

import shutil

# Simply copy the database file
shutil.copy("memu.db", "memu_backup.db")
Import from SQLite to PostgreSQL

To migrate data from SQLite to PostgreSQL:

SQLite reads and cached records retain the configured user scope fields, including after reopening the database. Export those fields along with the record so its ownership is preserved.

import json
from memu.database.sqlite import build_sqlite_database
from memu.database.postgres import build_postgres_database
from memu.app.settings import DatabaseConfig
from pydantic import BaseModel

class UserScope(BaseModel):
    user_id: str

# Load from SQLite
sqlite_config = DatabaseConfig(
    metadata_store={"provider": "sqlite", "dsn": "sqlite:///memu.db"}
)
sqlite_db = build_sqlite_database(config=sqlite_config, user_model=UserScope)
sqlite_db.load_existing()

# Connect to PostgreSQL
postgres_config = DatabaseConfig(
    metadata_store={"provider": "postgres", "dsn": "postgresql://..."}
)
postgres_db = build_postgres_database(config=postgres_config, user_model=UserScope)

# Migrate resources
for res_id, resource in sqlite_db.resources.items():
    postgres_db.resource_repo.create_resource(
        url=resource.url,
        local_path=resource.local_path,
        caption=resource.caption,
        embedding=resource.embedding,
        user_data={"user_id": getattr(resource, "user_id", None)},
        track=resource.track,
    )

# Similar for recall files, segments, and relations...

Performance Considerations

AspectSQLitePostgreSQL
SetupZero configurationRequires server setup
ConcurrencySingle writer, multiple readersFull concurrent access
Vector SearchBrute-force (in-memory)Native pgvector (indexed)
ScaleUp to ~100k itemsMillions of items
DeploymentSingle file, portableExternal service

Example: Full Workflow

import asyncio
from memu.app import MemoryService

async def main():
    # Initialize with SQLite
    service = MemoryService(
        database_config={
            "metadata_store": {
                "provider": "sqlite",
                "dsn": "sqlite:///my_memories.db",
            },
        },
    )

    # Commit prepared memory
    await service.commit_results(
        recall_files=[
            {
                "name": "Preferences",
                "track": "memory",
                "description": "what alice likes",
                "content": "# Preferences\n- prefers dark roast coffee",
            }
        ],
        user={"user_id": "alice"},
    )

    # Retrieve relevant memories
    context = await service.progressive_retrieve(
        "What are my preferences?", where={"user_id": "alice"}
    )
    for segment in context["segments"]:
        print(f"- {segment['text']} ({segment['score']:.2f})")

asyncio.run(main())

Troubleshooting

Database Locked Error

SQLite only allows one writer at a time. If you see "database is locked" errors:

  1. Ensure you're not running multiple processes writing to the same database

  2. Consider using PostgreSQL for concurrent access needs

  3. Use connection pooling with appropriate timeouts

Permission Denied

Make sure the directory containing the SQLite file is writable:

chmod 755 /path/to/data/directory

If vector search is slow with large datasets:

  1. Consider migrating to PostgreSQL with pgvector

  2. Use more selective where filters to reduce the search space

  3. Reduce top_k parameters in your retrieve configuration

339 files · 329 not served here

Advantages

  • Automatically distills reusable skills from agent history without manual intervention. evidence: README.md
  • Supports multiple storage backends including SQLite and Postgres for different deployment needs. evidence: README.md

Limitations

  • Some agents require specific modes (e.g., Work mode) and do not support memory features in standard chat modes. evidence: README.md
  • Certain models may decline setup steps, requiring a retry with a different model like Opus. evidence: README.md

Security

Risk level: Medium risk

This brain runs

Git hooks (2)

  • .pre-commit-config.yaml: pre-commit hooks from https://github.com/pre-commit/pre-commit-hooks at v6.0.0 (contributor tooling: runs only after pre-commit install) · uses the network
  • .pre-commit-config.yaml: pre-commit hooks from https://github.com/astral-sh/ruff-pre-commit at v0.14.3 (contributor tooling: runs only after pre-commit install) · uses the network

Agent instructions that run or fetch something (14)

  • AGENTS.md: Setup: `make install`
  • AGENTS.md: Run all tests: `make test`
  • AGENTS.md: Run focused tests: `uv run python -m pytest tests/<target_test>.py`
  • AGENTS.md: Full quality checks: `make check`
  • SKILL.md: Each supported host has its own adapter binary carrying its own install guide.
  • SKILL.md: Your job here is three steps: install the package, pick your binary, print and follow its guide.
  • SKILL.md: it installs helper interfaces only and is harmless to run on a personal machine.
  • SKILL.md: If you meet that error at any point, you are on a stale build: upgrade, then re-run the command that failed.
  • SKILL.md: With uv this means `uv tool install --upgrade memu-cli`, **not** `uv pip install`: however it is installed, `memu-cli` is a cross-session bridging tool and must be callable everywhere, not scoped to one project venv.
  • SKILL.md: Run:
  • SKILL.md: If the user does not mention an API key, or would rather keep memory on this device, run bare `<your-binary> init` and Step 3's guide will set up local memory.
  • SKILL.md: <your-binary> docs install
  • SKILL.md: **Install in one pass;
  • SKILL.md: Otherwise, after installation, run:

Install scripts (4)

  • Makefile (make install): echo "🚀 Creating virtual environment using uv"; uv sync; uv run pre-commit install
  • src/memu/hosts/claude_code/install.py: python src/memu/hosts/claude_code/install.py
  • src/memu/hosts/codex/install.py: python src/memu/hosts/codex/install.py
  • src/memu/hosts/pi/install.py: python src/memu/hosts/pi/install.py
  • Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:2)
  • Medium risk: runs-git-hook-remote-exec (.pre-commit-config.yaml:15)
  • Low risk: network-instructions (SKILL.md:33)
  • Low risk: scripts-present (src/memu/hosts/claude_code/install.py)
  • Low risk: scripts-present (src/memu/hosts/codex/install.py)
  • Low risk: scripts-present (src/memu/hosts/pi/install.py)

Attribution and licence

First committed by
GitHub avatar of evan-akevan-ak
Declared authors
  • MemU Team (declared in pyproject.toml)
Publisher
NevaMind AI (Community)
Source
NevaMind-AI/memU · commit fd86e38
Licence
Apache License 2.0 (files served here)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Contributors
sairin1202, xnne-bot, evan-ak, nevamind-agent, wutongyuonce

AutoGineer is not affiliated with or endorsed by evan-ak or NevaMind AI.

Install from source

329 of its files are not served here, so there is no ZIP. NevaMind-AI/memU at fd86e38