Ein Binary, alles drin
Was du davon hast
Ein Befehl installiert greppy, danach ist alles da. Keine Python-Umgebung, kein Modell-Server, kein Language Server, kein Account. Dein Agent ruft eine Datei auf, und die beantwortet Graph-Fragen, sucht nach Bedeutung und schreibt Kurzbeschreibungen mit zwei Modellen auf deiner GPU. Index, Graph und Embeddings entstehen auf deinem Rechner und bleiben dort. Der Browser für Web-Aufgaben liegt im selben Paket.
Was drin ist
$ 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
| Teil | liegt in | gemessen |
|---|---|---|
| CLI mit tree-sitter-Parsern, SQLite, Symbolgraph und Inferenz mit Metal-Kernels | bin/greppy |
974.329.232 Byte |
| Google EmbeddingGemma 300M (Q4_K) für die Suche nach Bedeutung | im Binary | 238.991.680 Byte, "embedded": true |
| Qwen3.5-0.8B (Q4_K_M), von uns per Destillation trainiert, für die Kurzbeschreibungen | im Binary | "embedded": true |
| Browser-Laufzeit auf der Engine Servo | bin/web-runtime/ |
178 MB |
| Workspace-Beschleunigung für Agenten: FSKit auf macOS, FUSE3 auf Linux | im Paket, optional | einrichten mit greppy workspace setup |
Das Binary bindet ausschließlich Bibliotheken von macOS selbst. SQLite, die Parser und die Modelle sind einkompiliert.
greppy doctor zeigt, was davon läuft: das gewählte Backend, die GPU, beide Inferenz-Daemons und den 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
…
Ohne Netz
Eine macOS-Sandbox sperrt jede IP-Verbindung, curl scheitert darin sofort. greppy indiziert in derselben Sandbox ein neues Projekt, rechnet die Embeddings mit dem eingebetteten Modell (2 inference misses), beantwortet eine Suche mit Kurzbeschreibungen und findet die Aufrufer.
$ 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
Die beiden Inferenz-Daemons halten keinen IP-Socket: lsof -i findet an ihnen nichts.
So funktioniert es
greppy ist ein natives Rust-Programm. Die tree-sitter-Parser für über 60 Sprachen und SQLite sind einkompiliert, die Gewichte und Tokenizer beider Modelle eingebacken. Die Inferenz läuft in Rust mit mitgelieferten Metal-Kernels auf Apple Silicon und CUDA-Kernels auf Linux, ohne Python, ohne Modell-Server, ohne HTTP.
Alle greppy-Prozesse und Agenten schicken ihre Modellarbeit an zwei lokale Daemons pro Nutzer, einen für Embeddings und einen für Kurzbeschreibungen. Sie sprechen über Unix-Sockets, und ein geladenes Modell bedient die Anfragen aller Prozesse reihum. Der Index liegt in einer SQLite-Datei außerhalb deines Repositorys; für serde mit 339 Dateien sind das 28,6 MB.
Die Browser-Laufzeit ist ein eigenes Programm im selben Paket, greppy web steuert sie.
| Plattform | Inferenz | Paket im Release v0.4.1 |
|---|---|---|
| macOS auf Apple Silicon | Metal | greppy-macos-arm64.pkg, 843.885.302 Byte |
| Linux x86_64 mit NVIDIA-GPU | CUDA | greppy-linux-x86_64.deb, 887.138.928 Byte, und greppy-linux-x86_64.rpm, 945.828.766 Byte |
Das Installationsskript erkennt die Plattform, prüft die SHA-256 des Pakets und legt greppy unter ~/.local/share/greppy/versions/<version> ab.
Die Befehle
| Befehl | was er tut |
|---|---|
greppy --version |
zeigt die installierte Version |
greppy doctor |
prüft Index, Inferenz-Backend, GPU und beide Daemons |
greppy doctor --json |
dazu Modell-ID, Format und SHA-256 beider eingebetteter Modelle |
greppy doctor --device metal |
legt das Inferenz-Backend fest: auto (Standard), metal oder cuda[:INDEX], für jeden Befehl |
greppy workspace setup |
richtet die Workspace-Beschleunigung für Agenten ein, FSKit auf macOS, FUSE3 auf Linux |
greppy workspace status |
zeigt Agenten-Workspaces und den Zustand des Providers |
Mehr in der Doku
- Plattformen: Backends, Pakete, Treiber und
--device - So funktioniert greppy: Graph, Modelle und Daemons
- Performance und Platzbedarf: Index- und Abfragezeiten auf Metal und CUDA
- Lokale Daten: was greppy speichert und wie du es entfernst