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.

PonderrindexerEnvio HyperIndexThe GraphNuthatch
Licence MITMITEnvio EULA, not OSI-approved; forking and modifying not allowedMIT and Apache-2.0 (graph-node)MIT OR Apache-2.0
What you run a Node.js 22.12+ projecta Rust binarya Node.js 22.15+ project; Docker for local developmentgraph-node, Postgres and IPFSone binary
Database in production Postgres (PGlite for development only)optional: Postgres, ClickHouse or CSVPostgres, with Hasura by default; ClickHouse per entity in v3Postgresnone: embedded store and Parquet; Postgres in scaled mode
Indexing logic TypeScript functionsYAML with no code, or Rust handlersTypeScript or ReScript handlersAssemblyScript mappingsnone: tables come from the ABI; SQL views and declared entities on top
Arbitrary per-event code yesyes, in Rustyesyesno
Data comes from your RPCyour RPC; HyperSync or a Reth ExEx optionalHyperSync by default, an Envio service needing an API token; your RPC optionalyour node or a provideryour RPC
Query with GraphQL, SQL over HTTP, PostgresGraphQL (with Postgres), SQL on the databaseGraphQL via Hasura, SQL on the databaseGraphQL; SQL is experimentalSQL over HTTP and the CLI, MCP; GraphQL only partial, in a separate build
Chains any EVM chainany EVM chainEVM chains, Fuel and SolanaEVM and NEAR in graph-node; more through Substreamsany EVM chain; none other built today
Reorgs rolled back within a window; errors if one crosses finalitya safe distance from the tip; advanced live reorgs are on its backlogrolled back up to 200 blocks on most chainshandled up to a threshold, 250 blocks by defaultonly the hot store changes; history is sealed past finality
Hosted by its makers no; a Railway guidenoEnvio Cloud: $0 development, $70 to $800 a month productionSubgraph Studio and the network: 100,000 queries a month free, then $2 per 100,000no; we host a nest on request, unbilled
For coding agents llms.txtllms.txtllms.txt, a docs MCP server, skills from inita Subgraph MCP server over the network, skillsan MCP server over your own nest, a skill and llms.txt from init
GitHub stars, 3 Nov 2026 1,1527615713,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.

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.

Where each cell comes from.

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.