Self-hosted EVM event indexing, with a real dashboard

Chainwatch.

A self-hosted dashboard that indexes EVM contract events into your own Postgres and alerts you when they matter.

FreePersonal use onlyv1.0.0129 KBmacOSWindowsLinux

Chainwatch puts a UI on top of rindexer, the open-source EVM event indexer. Pick a chain, paste a contract address, choose the events you care about, and watch them land in a Postgres database you own. Browse and search them in the built-in explorer, export CSV, and set alert rules that send signed webhooks or emails. It runs in Docker next to your own Postgres, has no accounts and no telemetry, and your RPC keys never leave your server. Event data is only as correct as your RPC provider.

Chainwatch overview with key metrics, an ingestion throughput chart and a table of indexers
6
chains with one-click RPC presets
Any EVM
chain through a custom RPC URL
HMAC-SHA256
signed webhook alerts
0
telemetry, accounts or hosted services
See it work

A dashboard for the indexer you already trust.

These are real screenshots of Chainwatch running against USDC on Base and Ethereum, indexed into a local PostgreSQL.

localhost:3000
The overview: system status, events indexed per second, sync health, and every indexer with its block height and lag. Real data from USDC on Base and Ethereum.
What you get

Indexing you can see, search and act on.

rindexer does the heavy lifting. Chainwatch gives it a wizard, an explorer, alerts and a health view, all running next to your own database.

A wizard instead of YAML

Pick a chain, paste a contract address, choose the events and a starting block. Chainwatch checks your RPC, loads the ABI (pasted, or fetched from Etherscan with your own key) and writes the rindexer configuration for you.

Live overview and sync health

See engine status, events indexed per second, the indexed block against the chain head, and lag per indexer. A ticker across the top follows every chain you watch.

An explorer for decoded events

Browse each event table as it fills. Search any address, hash or value, page through history, hide internal columns, copy values, and export what you see as CSV. Token amounts use the decimals you set.

Signed webhook and email alerts

Build rules such as “Transfer where value is greater than 1,000,000,000”. Each delivery is signed with HMAC-SHA256 and a timestamp so your receiver can verify it. New rules watch future events only.

Your data stays in your Postgres

rindexer writes decoded events into tables you own and can query with any SQL tool. Deleting an indexer keeps its data unless you drop it yourself.

Private by construction

No accounts, no telemetry, no hosted service. Your RPC keys are passed to the engine through environment variables and never written into the configuration file. One admin password protects the dashboard.

Supervised engine

rindexer runs as a supervised process. If it crashes it restarts with backoff, and it comes back by itself after a container restart, resuming from the last block it indexed.

Presets and any EVM chain

One-click presets for USDC and USDT, RPC defaults for Ethereum, Base, Arbitrum, Optimism, Polygon and BNB Smart Chain, and a custom RPC URL for any other EVM network.

How it works

From contract address to live events.

  1. 1

    Point it at a contract

    Choose the chain and paste the contract address. Chainwatch tests the RPC and reads the contract's events from the ABI.

  2. 2

    Pick events and a start block

    Index only what you need, from now or from a specific block. Busy contracts produce millions of events, so start close to the present unless you need history.

  3. 3

    Let the engine index

    Chainwatch writes the configuration and runs rindexer. Events are decoded into Postgres and the overview updates live.

  4. 4

    Explore and get alerted

    Search the events, export them, and add rules that call your webhook or send an email when something matches.

YAMLYAML
name: chainwatch
project_type: no-code
networks:
  - name: base
    chain_id: 8453
    # The RPC URL is read from the environment so it never sits in a file you might commit.
    rpc: ${RPC_BASE}
storage:
  postgres:
    enabled: true
contracts:
  - name: USDCBase
    details:
      - network: base
        address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
        start_block: 52228797
    abi: ./abis/USDCBase.abi.json
    include_events:
      - Transfer

The rindexer.yaml Chainwatch generated for the Base USDC indexer in the screenshots.

Quick start

Running in a few minutes.

You need Docker and an RPC endpoint. Unzip the download and pick a path.

Option 1

Docker Compose

The supported way: Chainwatch, rindexer and Postgres together.

ShellShell
unzip chainwatch-1.0.0.zip && cd chainwatch-1.0.0
cp .env.example .env
# set POSTGRES_PASSWORD, ADMIN_PASSWORD and SESSION_SECRET (openssl rand -hex 32)
docker compose up -d --build
# open http://localhost:3000

rindexer ships a linux/amd64 image only. On Apple Silicon use Rosetta emulation (colima start --vm-type vz --vz-rosetta, or Docker Desktop's Rosetta setting); the default QEMU emulation can crash Node.

Option 2

Put it behind HTTPS

The app listens on 127.0.0.1 only. Expose it through a reverse proxy.

ShellShell
# Caddyfile
chainwatch.example.com {
  reverse_proxy 127.0.0.1:3000
}

# then, in .env
COOKIE_SECURE=true

Do not publish port 3000 directly. There is one admin password and no roles.

Option 3

Verify a webhook

Every alert is signed. Check the signature and the timestamp.

Plain textPlain text
import crypto from "node:crypto";

export function verify(headers, rawBody, secret) {
  const ts = headers["x-chainwatch-timestamp"];
  const sig = headers["x-chainwatch-signature"] ?? "";
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const expected =
    "sha256=" + crypto.createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
  return sig.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}

The signing secret is shown once, when you create the rule.

Under the hood

Built to be inspected.

A small Next.js app next to rindexer and Postgres. Every moving part is a plain file or a standard Docker service, so you can read it, change it, or debug it.

  1. 01

    Your RPC

    Any EVM node or provider

  2. 02

    rindexer

    Fetches and decodes logs

  3. 03

    PostgreSQL

    Event tables you own

  4. 04

    Chainwatch

    Overview, explorer, rules

  5. 05

    Your systems

    Webhook or email

What is in the box

  • src/appDashboard pages and API routes (Next.js)
  • src/lib/supervisor.tsRuns and restarts rindexer
  • src/lib/rindexer-config.tsGenerates rindexer.yaml and ABI files
  • src/lib/alerts.tsRule matching and signed delivery
  • DockerfileCopies rindexer from its official image
  • docker-compose.ymlChainwatch and Postgres
  • .env.exampleEvery setting, documented
  • THIRD-PARTY-NOTICES.mdrindexer (MIT), fonts and dependencies

Stack

TypeScriptNext.js 16React 19PostgreSQL 17rindexer (MIT)DockerTailwind CSS 4Inter and JetBrains Mono (bundled)

Third-party components keep their own licences, listed in THIRD-PARTY-NOTICES.md inside the download.

Privacy

Your keys and data stay with you.

  • No telemetry, no accounts

    Chainwatch makes no calls home. The only outbound requests are to the RPC endpoint you configure, to Etherscan if you add a key, and to the webhook or SMTP server of your alert rules.

  • Keys stay in the environment

    RPC URLs are handed to rindexer through environment variables and are never written into the generated configuration file or the ABI files.

  • Your database, your data

    Events land in your PostgreSQL. You can query, back up or delete them with the tools you already use.

Honest limits

What it is, and is not.

  • It is only as accurate as your RPC provider. Public endpoints are rate-limited and not suitable for serious use.
  • rindexer publishes an amd64 image only, so ARM machines run Chainwatch under emulation.
  • Alerts are delivered once per matching event. A failed delivery is logged but not retried.
  • One admin password and no roles: run it on a private network or behind your own authentication.
  • Adding or changing an indexer restarts the engine, which briefly pauses all indexing.
  • Not affiliated with the rindexer project. Free for personal, non-commercial use only.
FAQ

Questions worth asking.

Do I need to know rindexer?

No. Chainwatch writes the rindexer configuration for you. If you do know rindexer, the generated rindexer.yaml and ABI files are plain files in the data volume.

Which chains does it support?

Any EVM chain you have an RPC URL for. Ethereum, Base, Arbitrum, Optimism, Polygon and BNB Smart Chain have one-click defaults.

Is my data sent anywhere?

No. Events are written to the PostgreSQL that comes with the Docker setup. Chainwatch only contacts your RPC, Etherscan (if you add a key), and the webhook or SMTP servers you configure.

Can I index all history of a busy contract?

You can, by choosing a starting block, but contracts like USDC produce millions of events. Speed depends on your RPC provider, so start near the present unless you need the history.

How do alerts work?

A rule watches one event, optionally with a condition on one field. Chainwatch checks for new rows every ten seconds and sends a signed webhook, an email, or both. New rules only watch future events.

Can I use it at work or for a client?

The freebie licence covers personal, non-commercial use. For commercial use, write to the studio.

Does it run on Apple Silicon?

Yes, under Rosetta emulation, because rindexer publishes an amd64 image only. See the quick start for the settings.

Get it

Free for you, owned by the studio.

Enter your email and we will send a private download link for Chainwatch v1.0.0. It is licensed to you for personal, non-commercial use only; Northline Studio owns the software and keeps all rights.

  • Next.js dashboard and API source (TypeScript)
  • Dockerfile and docker-compose.yml with Postgres
  • .env.example, README.md, THIRD-PARTY-NOTICES.md, and LICENSE.txt
  • Needs: Docker with Compose (on Apple Silicon: Rosetta emulation, since rindexer ships amd64 only)
  • Needs: An RPC endpoint for each chain you index
  • Needs: Optional: an Etherscan API key and an SMTP server

Read the full licence. Need commercial use? Write to hello@northlinestudio.dev.

Get Chainwatch free

Enter your email and we will send you a private download link.

We use your email to deliver the download. See the privacy policy.

Released 6 Oct 2026 · v1.0.0

Have a product to sell? We review, list, and sell it for you — you keep 90% of every sale.

Apply to sell with us