Live chain state streams from 3xpl into a Valkey tier within seconds. History lands once a day from the providers' own dumps into S3 and is modelled in Snowflake with dbt. One FastAPI serves both, and every layer is observable.
Live state for every chain comes from 3xpl's stream, seconds after each block. History is rebuilt once a day from the providers' own dumps — Blockchair for the 6 UTXO chains, 3xpl for every chain it still publishes — so the warehouse runs one day behind the chain tip by design. History for Liquid Network has been paused upstream since 2026-08-17 — live figures are unaffected.
A long-running ingestor holds 3xpl's WebSocket stream open and polls its bulk stats, writing the latest state of each chain into a Valkey live tier. Seconds-fresh, with no warehouse in the way.
Dagster pulls each day's dumps — Blockchair for the 6 UTXO chains, 3xpl for every chain it still publishes — into an S3 landing zone, and a daily gap check retries any missing day. The original files are the system of record and are kept forever.
Snowflake, modelled with dbt in four layers — staging, core, marts, serving — with enforced contracts on core and serving. Serving holds a rolling three-month window, rebuilt daily. Service access is RSA key-pair only, under least-privilege roles.
FastAPI behind the Cilium Gateway at /api/v1 — REST, plus a WebSocket feed per chain. Current state reads from the live tier, history from Snowflake serving. Authentik OIDC sign-in, API keys and tiered rate limits.
Next.js 16 App Router with React Server Components, Tailwind 4, Zustand, and TanStack Query.
Prometheus scrapes, Grafana dashboards, Loki log aggregation, and OpenTelemetry traces across every service.
Cilium network policies restrict pod-to-pod and outbound traffic, and SPIRE issues every workload a SPIFFE identity.
One k3s node, not a multi-zone fleet. Postgres runs a two-instance CloudNativePG cluster, the original dumps live in S3, and secrets are centralised in Doppler.