Kubernetes-native event indexer for Arc

Your chain events,
in your own Postgres.

Give it an ABI, a contract address, and an RPC. Arckive streams every on-chain event into your own PostgreSQL — one table per event, reliable and gap-free — from a single YAML manifest.

runs in your cluster · apache-2.0 · arckive.org/v1alpha1
arckive — usdc-arc
$
The gap

Dune is delayed and rate-limited. Raw logs leave reorgs and back-fill to you. The Graph means subgraphs and heavy ops. There was no declarative path to your events, in your Postgres, in plain SQL.

01How it works

Declare it. The operator does the rest.

One Indexer resource describes what you want. A Kubernetes operator keeps it true — database, schema, listener, optional read API.

STEP 1

Write one manifest

Contracts, ABI ref, RPC pool, storage mode — the whole setup.

kind: Indexer
metadata: { name: usdc-arc }
spec:
  rpc: # health-checked failover
    - https://rpc.arc.example
  storage: { mode: Embedded }
  contracts:
    - address: "0xA0b8…eB48"
      abi: { configMapRef: usdc-abi }
      startBlock: 0
STEP 2

The operator provisions

A reconcile loop turns the spec into running parts — and heals them.

Indexer CR — 1 YAML
Arckive Operator
postgres · schema · worker · read API
pod dies? config drifts? it converges back.
STEP 3

Query plain SQL

Each event is a table in your Postgres. No API between you and your data.

-- one table per event
SELECT "from", "to", value
FROM usdc_transfer
WHERE value > 1000000000
ORDER BY block_number DESC;
0x3786…39b3 0xdbcc…38db3,020.950xb51a…159a 0xa7b3…59933,454.570x9f21…c04a 0x53d0…b7da60,884.96

ABI in → tables out · empty events list = every event · startBlock: 0 backfills from genesis

02Reliability

Even if the network blips, no data is lost.

A poll-based backbone chosen for loss-free, self-healing ingestion — not just latency. Don't take our word for it: break something.

Cursor + checkpoint

The last processed block lives in Postgres. After any crash it resumes exactly there.

Gap-free backfill

Event inserts and cursor advance share one transaction — a commit, or nothing.

Reorg-safe on Arc

Indexes to the finalized tag — BFT finality means finalized blocks never reorg.

RPC failover

A health-checked pool with rotation, backoff, circuit-breaker. A blip never becomes a gap.

chaos lab — try to lose datasimulated
rpc-primary.arcrpc-backup.arcworker pod
chain head
8,123,456
cursor
8,123,456
lag
0
gaps
0
t+0.0s✓ usdc-arc · phase=Live · cursor=head · lag=0 · gaps=0
the invariant: gaps stay 0
03Benchmarks

Measured, not promised.

Every number comes from running the real worker against the public Arc testnet and reading only its production surface — Postgres rows and /metrics. Reproduce it with pnpm bench.

block → SQL, p50
395ms

Block close to queryable row on Arc testnet — live USDC traffic, WebSocket newHeads listening, not polling. Even p99 stays under a second (0.97s).

backfill catch-up
92.6 blocks/s

5,107 blocks of real USDC history caught up in 55 seconds over a public RPC — ~48× faster than the chain. Zero RPC errors.

burst ingest
2,628 events/s

The decode + transactional-SQL write ceiling, measured with WAN latency out of the picture.

The budget is published too: the head signal is consumed straight from the newHeads payload and one parallel eth_getLogs round-trip later the row is committed — the engine itself adds ~40ms; the rest of the latency belongs to how fast the RPC announces blocks — and it shrinks further with a cluster-local Arc node. Full methodology and raw results: benchmark report · docs/benchmarks.

04Compare

A specific combination nobody else offers.

DuneThe GraphRaw RPCArckive
Data in your own DBNoVia graph-nodeIf you build it✓ Yes
Plain SQL accessDune SQL onlyGraphQLRaw JSON✓ Yes
Reorg & gap handlingTheirsYesOn you✓ Built-in
Setup effortLowMed–highHigh✓ One YAML

Honest positioning: Dune stays great for ad-hoc analytics; The Graph for hosted multi-chain. Arckive is for teams that want their own Postgres, plain SQL, and K8s-native ops — together.

Get started

One YAML. A running indexer.

Runs in your cluster. Your data never leaves it.

$ kubectl apply -f https://arckive.org/install.yaml
runs in your cluster · apache-2.0 · v1alpha1