AI memory that survives across sessions, teammates, and vendors.
Project description
luplo
AI memory that survives across sessions, teammates, and vendors.
Last month I explained a decision to Claude Code. Today, back from vacation, a teammate's Codex already knew.
What luplo does
Your engineering decisions — structured, searchable, and cited by typed edges — so three weeks later you (or your teammate, or their AI) can answer "why is X like that?" and "what else depends on it?" without reading the codebase cold.
- Git for decisions. Append-only, typed edges, contradiction-aware.
lp impacttells you what breaks when you change something. Traversesdepends/blocks/supersedes/conflictsedges up to five hops.- MCP-native, vendor-neutral. Ships an MCP server on stdio — works with Claude Code, Claude Desktop, Cursor, Zed, or any MCP-compatible client. Also usable as a plain CLI with no AI at all.
- Full-text first. Vectors only rerank. PostgreSQL
tsquerywith glossary expansion does retrieval; optional pgvector reorders candidates. If it's not there, we say so.
Quickstart
# Install
git clone https://github.com/luplo-io/luplo.git
cd luplo
uv sync
# Database
createdb luplo
uv run lp init --project myapp --email you@example.com
# Record a decision
uv run lp work open "Auth rework"
uv run lp items add "Use JWT over session cookies" \
--type decision \
--rationale "Stateless auth scales; session store is an extra dep."
# Recall
uv run lp brief
uv run lp items search "auth"
uv run lp impact <decision-id> # blast radius
See the Quickstart for the full five-minute walkthrough including uv install, Postgres setup, and MCP wiring.
What luplo doesn't do
luplo is opinionated about what it will not become. The Philosophy page has the long version; the short one:
- Not a vector database. Vectors rerank
tsquerycandidates. They never lead retrieval and never invent candidates of their own. - Not a general-purpose AI memory. Engineering decisions only — not chatbot user profiles, conversation history, or arbitrary facts.
- Not an editable store. Decisions are immutable. They get superseded, never edited. Your mistakes are your most valuable data.
- Not a graph database. Edges are typed; traversal stops at five hops. If your project needs more, you're modeling it wrong.
- Not a plugin platform. luplo is a tool, not a framework. Integrate via webhook, sync worker, or MCP — not in-process Python.
If any of these make luplo a worse fit than a chatbot memory, a wiki, or a ticket queue, use that tool instead. Positioning explains where luplo does and doesn't fit.
Connect an MCP client
{
"mcpServers": {
"luplo": {
"command": "uv",
"args": [
"run", "--directory", "/absolute/path/to/luplo",
"python", "-m", "luplo.mcp"
],
"env": {
"LUPLO_DB_URL": "postgresql://localhost/luplo"
}
}
}
}
Drop this into .mcp.json (Claude Code), claude_desktop_config.json
(Claude Desktop), .cursor/mcp.json (Cursor), or your client's
equivalent. See the
MCP client guide
for details.
Architecture
PostgreSQL (tsquery + glossary expansion + pgvector reranking), typed
edges (depends / blocks / supersedes / conflicts), and three
interfaces sharing one core: lp CLI, MCP server on stdio, and a
FastAPI HTTP server.
Documentation
Full docs at luplo.readthedocs.io:
- Concepts — philosophy, positioning, architecture, data model, search pipeline.
- Guides — work units, tasks & QA, MCP clients, Remote server, worker.
- Reference — CLI, MCP tools, configuration, semantic impact categories.
- Roadmap — what we're building next.
- API reference — auto-generated from source.
Contributing
See CONTRIBUTING.md. Short version: English
everywhere, Google-style docstrings, ruff + pyright strict +
pytest, Conventional Commits. Large architectural PRs should open an
issue first — the shape of luplo is a curated decision.
License
AGPL-3.0-or-later. A CLA will be required for external contributions (not yet set up).
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
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 luplo-0.6.1.tar.gz.
File metadata
- Download URL: luplo-0.6.1.tar.gz
- Upload date:
- Size: 331.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 |
1a61ee1e0f38d36915bb00833c99f0d6eaa3e4d45f947b064d7da0468d406f5c
|
|
| MD5 |
3a6a034fc79a18137f4efce246c9c339
|
|
| BLAKE2b-256 |
b2456937a6adf53850edd6b0731efef29fa56d6dbf5287784ffe5bb28d8703e5
|
Provenance
The following attestation bundles were made for luplo-0.6.1.tar.gz:
Publisher:
release.yml on luplo-io/luplo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
luplo-0.6.1.tar.gz -
Subject digest:
1a61ee1e0f38d36915bb00833c99f0d6eaa3e4d45f947b064d7da0468d406f5c - Sigstore transparency entry: 1334087506
- Sigstore integration time:
-
Permalink:
luplo-io/luplo@7db557a77e3029903c28b41a4be9d8a42e1cfbbc -
Branch / Tag:
refs/tags/v0.6.1 - Owner: https://github.com/luplo-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7db557a77e3029903c28b41a4be9d8a42e1cfbbc -
Trigger Event:
push
-
Statement type:
File details
Details for the file luplo-0.6.1-py3-none-any.whl.
File metadata
- Download URL: luplo-0.6.1-py3-none-any.whl
- Upload date:
- Size: 141.2 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 |
d68433fee7dea894a40aef0f11c5d3ac9bf83381ec794226202861b4d4333122
|
|
| MD5 |
019ba532e37633ef9c0bac1852afc801
|
|
| BLAKE2b-256 |
c355d4789d5bf8e0a27da4b32c3a97229a1355d2a594b9587b9fe9f96e1155fe
|
Provenance
The following attestation bundles were made for luplo-0.6.1-py3-none-any.whl:
Publisher:
release.yml on luplo-io/luplo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
luplo-0.6.1-py3-none-any.whl -
Subject digest:
d68433fee7dea894a40aef0f11c5d3ac9bf83381ec794226202861b4d4333122 - Sigstore transparency entry: 1334087716
- Sigstore integration time:
-
Permalink:
luplo-io/luplo@7db557a77e3029903c28b41a4be9d8a42e1cfbbc -
Branch / Tag:
refs/tags/v0.6.1 - Owner: https://github.com/luplo-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@7db557a77e3029903c28b41a4be9d8a42e1cfbbc -
Trigger Event:
push
-
Statement type: