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.

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

recalla-0.4.0.tar.gz (65.7 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.4.0-py3-none-any.whl (58.8 kB view details)

Uploaded Python 3

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

Hashes for recalla-0.4.0.tar.gz
Algorithm Hash digest
SHA256 774b06ad6ff09691c78633719d161064e00799088cc1a24dc89bfe5a33de3401
MD5 9e6d96da47ead81bea9c0cc92ea6d54b
BLAKE2b-256 955f9289959447ca4e2bc9bb3484faf1390d39013716a7ca4e8de568d3551963

See more details on using hashes here.

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

Hashes for recalla-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 76b1caa095a7061a734eddc5dd6755c8b703eb3656853a6ac5e2b5d3eba1c7d5
MD5 7e3c852ae8d181bb1f143765b823acc8
BLAKE2b-256 d2dfd5b2358ede880bb14bb7ce560c9b4582fc44d800646deee6d47bdd50edd2

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