Skip to main content

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.

PyPI npm CI License Python

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.

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 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.

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

recalla-0.3.0.tar.gz (53.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

recalla-0.3.0-py3-none-any.whl (47.9 kB view details)

Uploaded Python 3

File details

Details for the file recalla-0.3.0.tar.gz.

File metadata

  • Download URL: recalla-0.3.0.tar.gz
  • Upload date:
  • Size: 53.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for recalla-0.3.0.tar.gz
Algorithm Hash digest
SHA256 5bf4640dfe41c77fd091b5c81b50e971c96053c9344e5bc9b2ae12337d1c6e80
MD5 fb6de409b5e085b0686cbe7a75004b3c
BLAKE2b-256 73497902c731a9315238dc6f814b69539e5c35a2e5203202913a61b5c71b62d2

See more details on using hashes here.

File details

Details for the file recalla-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: recalla-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 47.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for recalla-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d258234ff296f3a2ed8f1c553df2638503afb9937420b66358e0665381b4a92b
MD5 e11e5e453325ba69f80637f4e24f2aba
BLAKE2b-256 99be74b1cddac561cc9ba5edb369885f7469048b273a8c616249652808f9bed7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page