Features

One binary, everything inside

What you get

One command installs greppy, and then everything is there. No Python environment, no model server, no language server, no account. Your agent calls one file, and that file answers graph questions, searches by meaning and writes short descriptions with two models on your GPU. Index, graph and embeddings are built on your machine and stay there. The browser for web tasks comes in the same package.

What's inside

$ greppy --version
greppy 0.4.1
$ du -sh v0.4.1 v0.4.1/bin/greppy v0.4.1/bin/web-runtime
1.1G    v0.4.1
944M    v0.4.1/bin/greppy
178M    v0.4.1/bin/web-runtime
Part lives in measured
CLI with tree-sitter parsers, SQLite, symbol graph and inference with Metal kernels bin/greppy 974,329,232 bytes
Google EmbeddingGemma 300M (Q4_K) for search by meaning in the binary 238,991,680 bytes, "embedded": true
Qwen3.5-0.8B (Q4_K_M), trained by us through distillation, for the short descriptions in the binary "embedded": true
Browser runtime on the Servo engine bin/web-runtime/ 178 MB
Workspace acceleration for agents: FSKit on macOS, FUSE3 on Linux in the package, optional set up with greppy workspace setup

The binary links against macOS's own libraries and nothing else. SQLite, the parsers and the models are compiled in.

greppy doctor shows what of it is running: the selected backend, the GPU, both inference daemons and the index.

$ greppy doctor
status: ok
…
store_bytes: 28553554
store_mode: single
embedding_complete: true
inference: preference=auto explicit=false selected=metal device=metal:0000000100000471
…
  backend metal compiled=true available=true score=300 abi=1
    device metal:0000000100000471 Apple M5 memory_free=26800144384 memory_total=26800603136
…
  daemon embedding state=ready endpoint=/tmp/greppy-daemon-501/embedding-29a0b2f328340be0f959015526e5022b.sock
  daemon summary state=ready endpoint=/tmp/greppy-daemon-501/summary-54edb0d71ff2d80862083125f394706b.sock
project: serde
…
stats: files=339 nodes=4573 edges=9427
…

Without a network

A macOS sandbox blocks every IP connection, and curl fails inside it at once. In the same sandbox, greppy indexes a new project, computes the embeddings with the embedded model (2 inference misses), answers a search with short descriptions and finds the callers.

$ cat ../../no-ip-network.sb
(version 1)
(allow default)
(deny network-outbound (remote ip))
(deny network-inbound (local ip))
$ sandbox-exec -f ../../no-ip-network.sb curl -sS -m 10 -o /dev/null https://github.com
curl: (7) Failed to connect to github.com port 443 after 75 ms: Couldn't connect to server
$ sandbox-exec -f ../../no-ip-network.sb greppy index .
…
indexed 1 files (0 unsupported, 0 unreadable, 0 oversize, 0 file-limit, 0 time-budget); 2 nodes extracted; generation 1 (project: shop)
embedded 2 code spans (0 local-store reused, 0 global-cache hits, 2 inference misses, 5 considered, 3 non-definition skipped, 0 missing-file, 0 invalid-span, 0 oversize, 0 failed, 0 stale pruned)
$ sandbox-exec -f ../../no-ip-network.sb greppy search "remove VAT from a gross price"
pricing.py:1  net_price — computes a rounded net price from a gross value and vat_rate
pricing.py:5  invoice_net_total — sums the net_price of items using vat_rate
$ sandbox-exec -f ../../no-ip-network.sb greppy who-calls net_price
pricing.py:6  invoice_net_total

The two inference daemons hold no IP socket: lsof -i finds nothing on them.

How it works

greppy is a native Rust program. The tree-sitter parsers for over 60 languages and SQLite are compiled in, and the weights and tokenizers of both models are baked in. Inference runs in Rust with bundled Metal kernels on Apple Silicon and CUDA kernels on Linux, without Python, without a model server, without HTTP.

All greppy processes and agents send their model work to two local daemons per user, one for embeddings and one for short descriptions. They talk over Unix sockets, and one loaded model serves the requests of all processes in turn. The index lives in a SQLite file outside your repository; for serde with 339 files that is 28.6 MB.

The browser runtime is a separate program in the same package, and greppy web drives it.

Platform Inference Package in release v0.4.1
macOS on Apple Silicon Metal greppy-macos-arm64.pkg, 843,885,302 bytes
Linux x86_64 with NVIDIA GPU CUDA greppy-linux-x86_64.deb, 887,138,928 bytes, and greppy-linux-x86_64.rpm, 945,828,766 bytes

The install script detects the platform, checks the package's SHA-256 and puts greppy under ~/.local/share/greppy/versions/<version>.

The commands

Command what it does
greppy --version shows the installed version
greppy doctor checks index, inference backend, GPU and both daemons
greppy doctor --json adds model ID, format and SHA-256 of both embedded models
greppy doctor --device metal sets the inference backend: auto (default), metal or cuda[:INDEX], for every command
greppy workspace setup sets up workspace acceleration for agents, FSKit on macOS, FUSE3 on Linux
greppy workspace status shows agent workspaces and the state of the provider

More in the docs