Features

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, impact and path
  • Search: search, search-symbol and search-pattern