100% local · No cloud · No API keys

Search Your Notes
Like Your Brain Does

A local hybrid search engine for markdown knowledge bases. BM25 keywords, vector semantics, and LLM re-ranking — all running on your machine with llama.cpp. No cloud. No telemetry.

Hybrid
BM25
Vector
RRF
Re-rank
Signal
Expand
HyDE
Cache
0 B
Data sent to cloud
3
GGUF models (auto-download)
7
MCP search tools
SQLite
FTS5 + sqlite-vec, single file
Metal
GPU acceleration on macOS
Search Pipeline

Three engines. One result set.

BM25 keyword matching, vector semantic search, and cross-encoder re-ranking fused through Reciprocal Rank Fusion. Signal detection decides when to expand queries with an LLM.

BM25 Keyword Search

FTS5 with porter stemming and unicode61 tokenizer. Exact phrase matching, NEAR proximity, and individual term scoring. No models needed — works instantly.

Vector Semantic Search

768-dim embeddings via nomic-embed-text-v1.5. Finds conceptually similar documents even when keywords don't match. Stored in sqlite-vec for fast nearest-neighbor lookup.

RRF Fusion + Re-ranking

Top 30 from each backend, fused via Reciprocal Rank Fusion (k=60). Cross-encoder re-ranks top 10, blended 0.3 RRF + 0.7 reranker. All scores normalized to [0, 1].

Query Expansion

When BM25 signal is weak, Qwen3-1.7B generates synonym keywords for BM25 and a hypothetical answer document (HyDE) for vector search. Cached by blake3 hash.

Single SQLite File

FTS5 virtual table, vec0 vector index, LLM cache, and document metadata — all in one SQLite database with WAL mode. No external services to manage.

MCP Server

JSON-RPC 2.0 over stdio. 7 tools with lazy model loading — BM25-only calls never touch a model file. Drop into Claude Code or any MCP client.

How It Works

The hybrid search pipeline

Every query flows through signal detection, dual-backend retrieval, rank fusion, and optional cross-encoder re-ranking.

Q
Query
User input
Signal
≥0.85 & gap ≥0.15?
Expand
Qwen3-1.7B
BM25
Top 30
Vector
Top 30
RRF
k=60 fusion
Re-rank
Top 10, 0.3/0.7
Results
[0, 1] scores
Install

Download & build

Pre-built binaries for macOS and Linux, or build from source with Cargo. Requires Rust 2024 edition (1.85+).

Build from source
Terminal
cargo install --path .
# or build release directly
cargo build --release
Quick start
Terminal
# Add a collection of markdown files
life-search collection add ~/notes --name notes

# Index them
life-search update

# Keyword search (no models needed)
life-search search "meeting agenda"

# Generate embeddings (~262MB model, first run)
life-search embed

# Semantic search
life-search vsearch "what did we discuss last week"

# Full hybrid pipeline
life-search query "project timeline and deadlines"
Claude Code Integration

Add to Claude Code in 2 minutes

life-search runs as an MCP server over stdio. Claude Code discovers and calls the search tools automatically.

1
Install the binary

Download a pre-built binary above or build from source with cargo install --path .

2
Add your markdown collections

Point life-search at your notes, docs, or any folder of markdown files.

Terminal
life-search collection add ~/notes --name notes
life-search update
life-search embed
3
Configure MCP in Claude Code

Add life-search as an MCP server. Claude will discover all 7 search tools and call them as needed.

~/.claude.json
{
  "mcpServers": {
    "life-search": {
      "command": "life-search",
      "args": ["mcp"]
    }
  }
}
MCP Tools
Tool Description Models
search Full hybrid: BM25 + vector + RRF + expansion + re-ranking all 3
search_bm25 BM25 keyword search only none
search_semantic Vector semantic search embedder
search_get Retrieve document by filepath or docid none
search_ls List documents in a collection none
search_status Index health stats none
search_collections List all collections none