Over 60 languages, one command set
What you get
Your repository has a Python backend, a Go service, a TypeScript frontend and Java? Your agent asks the same way everywhere. greppy who-calls NAME finds the callers, whether in Python, Go, TypeScript or Java, and greppy search finds code by meaning across all languages. No search pattern per language, no language server per language, one command set for the whole repository.
One repository, four languages
In a small project, one function per language parses a price and a second one calls it.
$ git ls-files
go/cart.go
go/go.mod
go/pricing.go
java/shop/Cart.java
java/shop/Pricing.java
python/cart.py
python/pricing.py
ts/cart.ts
ts/pricing.ts
After greppy index ., your agent asks the same question in every language.
$ greppy who-calls parse_price
python/cart.py:5 cart_total
$ greppy who-calls ParsePrice
go/cart.go:6 CartTotal
$ greppy who-calls parsePrice
ts/cart.ts:4 cartTotal
$ greppy who-calls parseAmount
java/shop/Cart.java:9 Cart::sum
Every answer names the call site and the function it sits in. Search by meaning finds all four price parsers with one question, each with a sentence on what it does:
$ greppy search "turn a price string into a number"
ts/pricing.ts:1 parsePrice — parses a string into a number
go/pricing.go:5 ParsePrice — parses a string into a float64
python/pricing.py:1 parse_price — parses a text string into a rounded float value
java/shop/Pricing.java:4 Pricing::parseAmount — parses a string into a double
…
greppy where-am-i names the languages in its first line: for this project go, java, python, typescript, 9 files, 10 definitions, for serde rust, toml, markdown, 339 files, 3,908 definitions.
You ask serde the same question in Rust:
$ greppy who-calls visit_content_map
serde/src/private/de.rs:1152 ContentDeserializer::deserialize_any
serde/src/private/de.rs:1399 ContentDeserializer::deserialize_map
serde/src/private/de.rs:1415 ContentDeserializer::deserialize_struct
It works the same way in Elixir, Kotlin and Zig, here all three in one project:
$ greppy who-calls parse_price
cart.ex:3 total
$ greppy who-calls parsePriceKt
Pricing.kt:5 cartTotalKt
$ greppy who-calls parsePriceZig
pricing.zig:10 cartTotalZig
How it works
Every language gets its own tree-sitter parser, compiled into the binary. greppy bundles 66 tree-sitter grammars. From them come definitions and, depending on the language, edges for calls, usages, type references and imports. All languages land in the same graph and the same index, which is why who-calls, search and read work in a mixed repository without any configuration.
| Tier | Languages | What you get |
|---|---|---|
| Graph fully tested | Rust, Python, Java, JavaScript, TypeScript, Go, C++, C#, Kotlin, Swift, Ruby | symbols, search, reading, editing and a graph whose calls, usages, type references and imports are checked for completeness per language |
| Graph edges | further procedural languages, for example Elixir, Zig, Solidity, OCaml and Lua | symbols, search, reading, editing, plus call, usage and import edges |
| Symbols and text | declarative formats such as TOML and Markdown | keys and sections as symbols, plus text search |
Fully tested means that for each of these eleven languages, greppy tests cross-file calls, usages, type references and imports, plus stable reindexing, on fixtures and real repositories. More languages follow in waves.
Search by meaning does not depend on graph edges. EmbeddingGemma embeds the definitions of every indexed language, and the local Qwen model writes the sentence under every function found. That way search also finds code that no call connects.
The commands
| Command | what it does |
|---|---|
greppy where-am-i |
the repository at a glance, with its languages, directories and entry points |
greppy who-calls S |
who calls or uses S, in every language with call edges |
greppy search "…" |
definitions by meaning, across all languages of the repository |
greppy search-symbol NAME |
definitions whose name contains NAME, TOML keys and Markdown sections included |
greppy read S |
read exactly one definition, with file and lines |
greppy index . |
build graph and embeddings for all languages of the repository |
More in the docs
- Languages: the tiers, the fully tested languages and how a new language gets added
- Navigate the graph:
who-calls,callees,impactandpath - Search:
search,search-symbolandsearch-pattern