Showcase
Charts built from one SQL query each
Expiry horizons, top creators, attribute usage and activity. Open the SQL behind any chart and edit it in the playground.
Explore showcaseRead only SQL index for Arkiv
Every live entity is loaded into DuckDB in this tab. Join, group and window them in milliseconds, with no 200 row pages.
… per query, measured in this tab
Start from ready made views, or write your own query.
Showcase
Expiry horizons, top creators, attribute usage and activity. Open the SQL behind any chart and edit it in the playground.
Explore showcasePlayground
Query entities and attributes with autocomplete, history, CSV export and a one click check of any row on chain.
SELECT creator, count(*) AS n
FROM entities
GROUP BY creator
ORDER BY n DESCOpen playground The most recent creates, updates and deletions seen by this tab.
Loading…
Arkiv attributes are written by whoever creates the entity, and arkiv_query only filters and pages.
Anyone can create an entity with project = arkiv-sql-indexer-demo, so a dashboard that trusts that attribute counts forged rows as its own. $creator is set by the chain. Scope the index with $creator = addr(…) and look alikes never get in.
arkiv_query returns at most 200 results per page, with no JOIN, GROUP BY or ORDER BY on attributes. Here the same data sits in DuckDB in your tab, so those queries just work.
A self hosted indexer prepares files. Your browser runs the SQL and talks to Arkiv directly.
A Bun indexer replays public eth_getLogs, fills attributes in pinned batches of at most 50 keys, and publishes versioned Parquet snapshots plus a JSON delta.
A Next.js proxy serves those files. DuckDB WASM loads them, and the tab polls the public RPC for new logs and goes to it directly for payloads and verify, without an API key.
apps/indexer/src/fill.ts, apps/indexer/src/snapshot.ts, apps/web/lib/proxy.ts, apps/web/lib/live-tail.tsThe index leans on properties the chain guarantees, and keeps the rest off chain on purpose.
$creator and $owner are system fields. The chain sets them, so the creator scope cannot be forged with an attribute.expiresAt block. The index enforces it instead of inventing its own retention.$creator, $key and atBlock with cursor pagination.Off Arkiv on purpose: the Parquet snapshots, the DuckDB checkpoint and SQL execution. Payloads stay on chain and load on demand.
SPECS.md, arkiv/schema.md, apps/indexer/src/store.tsEach one is in the code, and each one shows up somewhere in this app.
expires_at moves forward. Verify reports extended when the chain holds a newer update with a later expiry than your row.apps/demo-writer/src/writer.ts, apps/demo-writer/src/plan.ts, apps/web/lib/verify.tsNothing here asks for trust you cannot test from a browser.