← Blog

The robin keeps the books, the nuthatch keeps the cache

cargopete

rotki’s logo is a robin perched on an abacus. The name is short for Rotkehlchen, German for the European robin, literally “little red throat”. Nuthatch is named after a different small European garden bird, one that wedges nuts into bark, hacks them open, and hides the surplus in crevices to come back for later. I did not choose either name with the other in mind. Having spent a week putting the two pieces of software together, I am now fairly sure that they want the same thing from the world, and each is missing the half the other has.

That is a claim that sounds like a press release, so the rest of this post is the evidence for it, followed by the part where it falls short.

A robin that keeps its own books

rotki describes itself as “a privacy-focused portfolio manager, accounting, and analytics tool”. It runs on your machine, keeps its database encrypted locally, and is open source under the AGPL. The abacus in the logo is apt: most of what rotki does is careful bookkeeping, turning a wallet’s transactions into decoded events, cost basis and tax reports.

Robins are famously territorial about their own patch of garden, and rotki is territorial about your data in the same spirit. Everything it can compute locally, it does.

The one stranger rotki still has to ask

There is one thing it cannot compute locally: an account’s history. An Ethereum node can tell you an account’s balance, but not the list of transactions that touched it, so rotki asks a block explorer, usually Etherscan, for every transaction, internal transaction and token transfer of every account you track. The explorer therefore learns your complete set of addresses, tied together by one API key. For a privacy tool, that is the awkward guest at an otherwise well-kept feeder.

On several chains it is also a paid guest: there rotki users are asked to buy an explorer key before their history arrives at all.

A nuthatch hides what it finds and goes back for it

Indexing is, more or less, what the bird does: find the thing once, put it somewhere you control, and fetch it again on demand. A rotki-mode nest watches the accounts you give it, reads the chain over your own RPC, keeps the history in a local store, and serves it at /api in the shapes Etherscan uses. rotki already speaks that dialect, so the integration is small: rotki#13375 adds the nest as an indexer built on rotki’s existing Etherscan-shaped client, and every answer the nest cannot give falls through to the next indexer in the user’s order.

Since 5.5.0 a nest serves history on Optimism, Base, Arbitrum, Polygon, BNB Chain and Gnosis without any explorer key, and since 5.6.0, released today, one nuthatch dev serves several chains at one address. rotki takes exactly one nest address, so that was the piece it needed. rotki registers your accounts with the nest itself, on each chain whose indexer order names it.

The nest is light, too. An ordinary wallet with 1.19 million blocks of history took about 20 minutes to backfill over a hosted RPC on 2026-10-14, with 7,324 RPC calls and a 2.5 MB index.

Both birds refuse to guess

The deeper reason they fit is that both pieces of software treat a missing answer as worse than a slow one. rotki’s accounting is only as good as the history under it: a transaction it never saw is a hole in someone’s tax report that nobody notices. A nest that has not yet covered the range it is asked about answers NUTHATCH_INCOMPLETE and names the block it is covered through, rather than returning an empty list that would look exactly like an account with no activity.

This happened tonight, unplanned. My Ethereum nest was 94 blocks behind the head because its trace provider kept timing out. rotki asked, the nest refused, rotki recorded that the sync would be retried, and a few minutes later it was. Nothing was quietly missing in between. It is entirely unremarkable behaviour, which is what one wants from anything that ends up near a tax return.

What has been measured so far

Every figure below is rotki’s or Etherscan-shaped output compared field by field against a source nuthatch does not control.

ChainWhat was comparedResultHow much to trust it
Ethereumvitalik.eth, blocks 18M to 20M, against Etherscantxlist 2,318 transactions, tokentx 3,334, identicalHigh
EthereumMy wallet from genesis, rotki with the nest alone against rotki with Etherscan, 2026-10-1519 of 19 events over 9 transactions, every field identicalHigh, but a small wallet
Gnosisrotki with the nest alone against Blockscout and Etherscan82 of 82 eventsHigh
OptimismThree accounts against Blockscout1,411 of 1,411 transactions on the largestHigh
ArbitrumAgainst Blockscout594 of 594High
BaseAgainst my own earlier spike, 905 transactionsIdenticalMedium: the reference is mine
Polygon, BNB ChainOne account each, books checked to the weiNothing to compare againstLow

The last two rows are the honest ones. Without a free reference there is nothing independent to check against, so all I can say is that the balances add up.

Not quite a match made in heaven, yet

The robin has not yet agreed to share the feeder. My first pull request to rotki was larger than anyone wanted to review, and Lefteris, rotki’s founder, declined it and asked instead for a general way to add an indexer. That design is rotki#13372, and #13375 is the small first step, awaiting review. Until it merges, you have to run rotki from that branch.

Beyond that:

  • #13375 covers transactions, internal transactions and token transfers only. The nest already serves withdrawals, produced blocks and MEV, but rotki does not ask it for them yet.
  • Off Ethereum, a contract account or an EIP-7702 delegated account cannot be proved from balances, so the nest answers unsupported from the block it gained code and rotki asks its next indexer.
  • An incoming transaction that moves no value is not listed, though Etherscan lists it. It changes nothing in rotki’s books, but it is a difference.
  • The RPC you point the nest at still sees which addresses are being asked about, as it already does when rotki reads balances. Only your own node makes that nobody’s business.
  • A backfill from genesis takes hours rather than minutes, and needs a trace-capable RPC.

Try it

The rotki page has the config, the commands and the settings, and my earlier post is the first afternoon I spent with rotki, mistakes included. If you run rotki and pay for an explorer key on Base or Gnosis, I would particularly like to hear how the nest does on your accounts.