The speed of grep with the understanding of an IDE — all running locally.
Sub-100-ms warm daemon replay in fresh shared Linux validation. Hash embeddings deliver immediate first results; neural models upgrade silently in the background.
No hosted inference. No telemetry. Your source code, queries, and index data never leave your machine. Neural mode downloads model assets once on first use.
Combines classic BM25 text matching with 384-dimensional local Candle neural embeddings. Ask "where is the tax calculated?" and get the right function.
Understands branches, worktrees, and .gitignore natively. Branch switches trigger instant Merkle-diff re-indexes — never a full re-scan.
Ships with a built-in MCP server. One command to connect Claude Code, Cursor, Codex, Gemini, or OpenCode — no plugins needed.
21 languages with Tree-sitter AST parsing. Understands functions, classes, and imports — not just lines of text.
| Feature | grep / rg |
GitHub Search | zoekt |
ivygrep |
|---|---|---|---|---|
| Works offline | ✅ | ❌ | ✅ | ✅ |
| Natural language queries | ❌ | ⚠️ | ❌ | ✅ |
| Semantic understanding | ❌ | ❌ | ❌ | ✅ |
| Warm indexed query latency | ✅ | ❌ | ✅ | ✅ |
| Privacy-first (no upload) | ✅ | ❌ | ✅ | ✅ |
| AST code chunking | ❌ | ❌ | ⚠️ | ✅ |
| Incremental Merkle indexing | ❌ | ❌ | ❌ | ✅ |
| Git worktree overlays | ❌ | ❌ | ❌ | ✅ |
| Built-in MCP server | ❌ | ❌ | ❌ | ✅ |
Fast indexing with progressive quality upgrades — you never wait for neural models.
Sub-second indexing via 128-bit xxh3 SIMD structural hashes. Instant search availability.
Lexical BM25 (Tantivy) and semantic ANN (USearch) fuse via Reciprocal Rank Fusion for high-precision results.
Background daemon upgrades to a locally cached Candle model (AllMiniLML6V2). macOS releases use Accelerate-backed local CPU math; Metal is an opt-in local build.
Deeply understands git. Not an afterthought — a core design decision.
When you git worktree add, ivygrep does not copy the search index. Each worktree references one shared base index while its SQLite, lexical, and vector overlay stores contain only divergent chunks and tombstones. Lightweight Merkle metadata tracks filesystem state.
Switching branches triggers Merkle reconciliation that re-indexes only the changed files instead of rebuilding the search index. Content-based hashes mean byte-identical files across branches are never re-processed.
Fresh validation on the Linux kernel: 93,502 indexed files and 4,419,660 chunks on a shared x86 workspace
grep -rnexact stringrgexact stringighistorical dedicated-host process-cold queryigbest retained dedicated-host daemon p95grep and rg scan every file at query time. ivygrep queries a pre-built index. The chart shows retained dedicated-host results. Fresh June 2026 shared x86 validation measured ~137 ms process-cold p95, ~79 ms warm daemon cache-replay p95, and ~116 ms warm distinct-query p95. Hardware and storage matter.
Daemon hot-query benchmark · Linux kernel indexing benchmark · CI benchmark dashboard
Validation is automated: CI runs fmt, ShellCheck, clippy, unit/integration tests, documented procedure E2E, labeled relevance checks, and benchmark regression gates.
8 threads × Linux kernel — simulating MCP agent traffic
Tree-sitter languages get function/class-level structural chunking. All others get intelligent heuristic chunking with full index coverage.
ivygrep ships a built-in MCP server. Instead of stuffing entire repos into context windows, your agent queries your indexed codebase natively, with sub-100-ms warm daemon replay in fresh shared Linux validation.
claude mcp add -s user ig -- ig --mcp
codex mcp add ig -- ig --mcp
gemini mcp add --scope user --transport stdio ig ig --mcp
"ig": { "type": "stdio", "command": "ig", "args": ["--mcp"] }
"ig": { "type": "local", "command": ["ig", "--mcp"] }
Pass the absolute current repository or worktree path to ig_search. Use natural-language queries for concepts, literal=true for exact identifiers, and ig_status when indexing health is unclear.
The first search creates an index and starts incremental watching. Worktrees reuse one shared base index and store only divergent chunks and tombstones.
Full integration guideOne command installs the latest release and verifies its published SHA-256 checksum.
$ brew install bvolpato/tap/ivygrep
$ curl -fsSL https://raw.githubusercontent.com/bvolpato/ivygrep/main/install.sh | sh
irm https://raw.githubusercontent.com/bvolpato/ivygrep/main/install.ps1 | iex
ig --add .
ig "where is authentication handled?"
ig --literal "handleAuth"
claude mcp add -s user ig -- ig --mcp