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.1.tar.gz (72.8 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.1-py3-none-any.whl (60.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: recalla-0.4.1.tar.gz
  • Upload date:
  • Size: 72.8 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.1.tar.gz
Algorithm Hash digest
SHA256 7f9a95f5ce28d9c4d4569e47c412a593460c94cda4ed26467e659582346e8998
MD5 cd59cc5742f6d0de626d773ca42e364f
BLAKE2b-256 364799e5e726e579e5834a1b2775949bec65155a0e8530b6dd87113bc027883b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: recalla-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 60.3 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 267369041defd9dd4a81132b4c64f512a1f9590a0ebae76dc5e07ba7d382eb6d
MD5 6057d1de3f4647e70c9ef299af5a41ee
BLAKE2b-256 77a299d448d0a78807fa5b0479071cbf2a8798644fcba1c842504820c2733e0a

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