A local-first, agent-native second brain. Pull it, run it, own it.
Project description
recalla
A local-first, agent-native second brain. Pull it, run it, own it.
recalla turns a folder of markdown notes into a fast, token-cheap layer that any LLM or agent can read: compressed entity cards, a wikilink graph, and a local HTTP API + MCP surface. No cloud. No account. No telemetry. Your notes never leave your machine.
It works with plain markdown and with Obsidian vaults. It is agent-agnostic: Claude, Cursor, Codex, or any MCP client can read your brain through it.
Who it is for
recalla serves two audiences with one engine:
- AI builders and power users. A CLI,
pip/npm, a local HTTP API, and an MCP server. Wire your vault into any agent, search it, walk the graph, drill into sections, all locally. - Everyone else. An Obsidian plugin (one click, no terminal), a standalone
binary (no Python), and
recalla ask "..."to chat with your notes in plain language. See docs/install.md.
No cloud, no account, no telemetry, for either audience.
Why
Your knowledge is in markdown. Agents are expensive to feed raw markdown. recalla builds an index of small cards (roughly a quarter the tokens of the full note) plus a graph the agent can walk in a few hops, so it finds the right context fast and cheap, then reads full notes only when it needs the detail.
Install
pip install recalla # core engine + CLI
pip install 'recalla[mcp]' # also install the MCP server
Requires Python 3.10+. The core has one dependency (PyYAML). The local server is pure standard library.
Quickstart (60 seconds)
The fastest path (no Python knowledge needed to scaffold):
npx create-recalla my-vault # scaffold a runnable vault in one command
cd my-vault
pip install recalla
recalla index # build the .recalla/ index
recalla serve # local API at http://127.0.0.1:8090
Or with the Python CLI directly:
recalla init my-vault # scaffold a vault (or run inside an existing one)
cd my-vault
recalla index # build the .recalla/ index
recalla serve --watch # local API, auto-reindexing as you edit notes
In another terminal:
curl 'http://127.0.0.1:8090/bootstrap'
curl 'http://127.0.0.1:8090/find?q=welcome'
curl 'http://127.0.0.1:8090/walk?id=how-it-works&hops=2'
Already have an Obsidian vault? Point at it and index in place:
cd ~/Documents/my-obsidian-vault
recalla init . --name my-vault # writes recalla.config.yaml only
recalla index
recalla serve
Commands
| Command | What it does |
|---|---|
recalla init [path] |
Scaffold a new vault (writes recalla.config.yaml + starter notes) |
recalla index |
Build .recalla/ (cards, graph, outlines, bootstrap, meta) |
recalla serve [--watch] |
Run the local read API on 127.0.0.1:8090 (optionally auto-reindex) |
recalla ingest <adapter> <source> |
Import a source (markdown, plaintext, chatgpt, claude, notion) |
recalla ask "<question>" |
Ask your vault in plain language (RAG; bring your own LLM key or use Ollama) |
recalla search "<query>" |
Search from the terminal (hybrid BM25 + semantic) |
recalla embed |
Build the semantic index so search becomes hybrid everywhere |
recalla agents |
Generate AGENTS.md + llms.txt so any agent self-orients |
recalla new <category> <title> |
Create a note from the template |
recalla daily |
Create or open today's daily note |
recalla outline <id> |
Show a note's heading tree |
recalla doctor |
Validate the vault (broken links, duplicates, schema); CI-friendly |
recalla status |
Show index build stats |
recalla mcp |
Run the MCP server over stdio (needs [mcp] extra) |
The vault is discovered via --vault PATH, the RECALLA_VAULT env var, or by
walking up from the current directory to find recalla.config.yaml. No paths are
hardcoded.
API
All endpoints are GET and return JSON, bound to localhost only.
| Endpoint | Purpose |
|---|---|
/bootstrap |
~2K-token orientation: counts, categories, top hubs |
/find?q=&limit= |
Fuzzy entity lookup by title / alias / id |
/search?q=&limit= |
Keyword search across cards |
/card?id= |
One compressed card (with heading outline) |
/outline?id= |
A note's heading tree |
/section?id=&sel= |
Raw markdown of one section (by anchor or path) |
/walk?id=&hops=&limit= |
BFS neighbors with their cards |
/recent?days=&limit= |
Recently updated notes |
/raw?id= |
Full markdown body (verbatim) |
Use with an MCP agent (Claude Desktop, Cursor, Claude Code)
{
"mcpServers": {
"recalla": {
"command": "recalla",
"args": ["mcp", "--vault", "/absolute/path/to/your/vault"]
}
}
}
Tools exposed: recalla_bootstrap, recalla_find, recalla_search, recalla_card,
recalla_outline, recalla_section, recalla_walk, recalla_recent, recalla_raw.
Chat with your vault
recalla ask "what did we decide about the database?"
Retrieval is fully local; only the assembled context goes to the LLM you choose
(OpenAI or Anthropic via env key, or local Ollama with --provider ollama, or an
offline echo fallback). See docs/chat.md.
Semantic search
recalla embed # build the local vector index (offline, zero deps)
recalla search "money runway" # search is now hybrid BM25 + semantic, everywhere
Once embedded, the CLI, /search, the recalla_search MCP tool, and recalla ask
all use hybrid ranking. See docs/semantic.md.
Note schema
Notes are markdown with optional YAML frontmatter. Nothing is mandatory, but the richer the frontmatter, the better the cards.
---
title: Theo Sakalidis
category: people
status: active
aliases: [theo]
tags: [cofounder]
related: [cevi-ai]
created: 2026-01-01
updated: 2026-06-01
---
# Theo Sakalidis
Short lead paragraph becomes the card summary.
## Timeline
- **2026-05-15**: a dated event becomes part of the entity's history.
Link entities with [[wikilinks]]. Links become the graph.
Privacy
recalla is local-first by design. It reads your files, writes an index next to
them in .recalla/, and serves on 127.0.0.1. It makes no network calls and ships
no telemetry. Add .recalla/ to your .gitignore (the scaffolder does this for
you) so the rebuildable index stays out of git.
Roadmap
See docs/roadmap.md. Short version: v0.1 is the read engine
(this). Next come the MCP polish + npx create-recalla scaffolder, source
ingestion adapters, hierarchical retrieval, and the optional Recalla OS protocol
layer (daily ritual, ledgers) plus configurable personas.
License
Apache-2.0. See LICENSE.
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 recalla-0.4.0.tar.gz.
File metadata
- Download URL: recalla-0.4.0.tar.gz
- Upload date:
- Size: 65.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
774b06ad6ff09691c78633719d161064e00799088cc1a24dc89bfe5a33de3401
|
|
| MD5 |
9e6d96da47ead81bea9c0cc92ea6d54b
|
|
| BLAKE2b-256 |
955f9289959447ca4e2bc9bb3484faf1390d39013716a7ca4e8de568d3551963
|
File details
Details for the file recalla-0.4.0-py3-none-any.whl.
File metadata
- Download URL: recalla-0.4.0-py3-none-any.whl
- Upload date:
- Size: 58.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76b1caa095a7061a734eddc5dd6755c8b703eb3656853a6ac5e2b5d3eba1c7d5
|
|
| MD5 |
7e3c852ae8d181bb1f143765b823acc8
|
|
| BLAKE2b-256 |
d2dfd5b2358ede880bb14bb7ce560c9b4582fc44d800646deee6d47bdd50edd2
|