Compare
Five indexers, honestly.
Ponder, rindexer, Envio HyperIndex and The Graph all index EVM contracts, and each makes a different bet about what you write and what you run. Nuthatch bets that for your own contracts you should write nothing and run one binary. That bet loses some rows, and they are in the table. Every cell about another project comes from its own docs or repository, read on 3 November 2026, and is linked below the table.
| Ponder | rindexer | Envio HyperIndex | The Graph | Nuthatch | |
|---|---|---|---|---|---|
| Licence | MIT | MIT | Envio EULA, not OSI-approved; forking and modifying not allowed | MIT and Apache-2.0 (graph-node) | MIT OR Apache-2.0 |
| What you run | a Node.js 22.12+ project | a Rust binary | a Node.js 22.15+ project; Docker for local development | graph-node, Postgres and IPFS | one binary |
| Database in production | Postgres (PGlite for development only) | optional: Postgres, ClickHouse or CSV | Postgres, with Hasura by default; ClickHouse per entity in v3 | Postgres | none: embedded store and Parquet; Postgres in scaled mode |
| Indexing logic | TypeScript functions | YAML with no code, or Rust handlers | TypeScript or ReScript handlers | AssemblyScript mappings | none: tables come from the ABI; SQL views and declared entities on top |
| Arbitrary per-event code | yes | yes, in Rust | yes | yes | no |
| Data comes from | your RPC | your RPC; HyperSync or a Reth ExEx optional | HyperSync by default, an Envio service needing an API token; your RPC optional | your node or a provider | your RPC |
| Query with | GraphQL, SQL over HTTP, Postgres | GraphQL (with Postgres), SQL on the database | GraphQL via Hasura, SQL on the database | GraphQL; SQL is experimental | SQL over HTTP and the CLI, MCP; GraphQL only partial, in a separate build |
| Chains | any EVM chain | any EVM chain | EVM chains, Fuel and Solana | EVM and NEAR in graph-node; more through Substreams | any EVM chain; none other built today |
| Reorgs | rolled back within a window; errors if one crosses finality | a safe distance from the tip; advanced live reorgs are on its backlog | rolled back up to 200 blocks on most chains | handled up to a threshold, 250 blocks by default | only the hot store changes; history is sealed past finality |
| Hosted by its makers | no; a Railway guide | no | Envio Cloud: $0 development, $70 to $800 a month production | Subgraph Studio and the network: 100,000 queries a month free, then $2 per 100,000 | no; we host a nest on request, unbilled |
| For coding agents | llms.txt | llms.txt | llms.txt, a docs MCP server, skills from init | a Subgraph MCP server over the network, skills | an MCP server over your own nest, a skill and llms.txt from init |
| GitHub stars, 3 Nov 2026 | 1,152 | 761 | 571 | 3,157 (graph-node) | 7 |
Prices are as each vendor's own page states them, not a quote. Vendor speed figures are left out: we have not measured any of these projects against Nuthatch, and a benchmark one side publishes about itself is not a comparison.
Where Nuthatch loses
The rows that go the other way.
You cannot write a handler.
Every other project here runs code you wrote for each event: TypeScript, AssemblyScript, ReScript or Rust. Nuthatch runs none. Tables come from the ABI, and anything derived is an SQL view, a declared entity or a built-in. If your index needs ordered, stateful logic, a price carried from one swap to the next, Nuthatch cannot express it, and that is a design decision rather than a gap in the backlog.
EVM only.
Envio indexes Fuel and Solana, and The Graph serves non-EVM networks through Substreams. Nuthatch indexes any EVM chain with a JSON-RPC endpoint, nine of them built in, and no other kind today. A non-EVM chain is added when a named user asks for one.
A young SQL engine.
Burrmill, the engine on DataFusion that replaced DuckDB in 4.1, is slower than DuckDB was. On one production nest each statement took about 2.5 times DuckDB's time with eight times the memory, and a date range arriving through a join is not pushed down to the scan. The figures, and what came of them.
Few users.
The repository has 7 stars against Ponder's 1,152 and graph-node's 3,157. Fewer people have hit the bugs before you, there are fewer answers to search for, and the project depends on a small team. The head count publishes how many people said yes to being counted, as a floor.
GraphQL is partial.
Ponder, Envio and The Graph serve GraphQL as a matter of course. Nuthatch's default binary has none, and the separate graph build answers a subgraph's event-shaped fields only. A client cannot switch to it by changing a URL. What moves and what does not.
Backfill is as fast as your RPC.
Envio reads history from HyperSync by default, a service it runs for exactly that, and rindexer can use it too. Nuthatch reads only from the endpoints you give it, which keeps your data path your own and makes a long history wait on your provider. We have not benchmarked the two against each other.
Choose Nuthatch when
- the contracts are yours, or their events are what you want, and you would rather write nothing;
- you want one process on your own machine, with no database to run and no account or token to hold;
- you want to ask in SQL, or let a coding agent ask over MCP;
- you need sealed history you can check by hash and re-derive from the chain.
Choose another when
- your index needs logic per event, prices and running state above all: Ponder, Envio or a subgraph;
- your chain is not EVM: Envio or The Graph's Substreams;
- your clients already speak GraphQL and must not change;
- you want to buy indexed data rather than produce it: The Graph's network or Envio Cloud.
Sources
Where each cell comes from.
Ponder
rindexer
Envio HyperIndex
The Graph
GitHub stars were read from the GitHub API on 3 November 2026, for ponder-sh/ponder, joshstevens19/rindexer, enviodev/hyperindex, graphprotocol/graph-node and nuthatch-org/nuthatch. Something here out of date or wrong? Say so on GitHub Discussions and we will correct it.