Skip to content

Self-hosting Kilden

Kilden is built to be self-hostable, and self-hosting will be documented here when our open source release ships. No date promises — we’d rather publish it working than announced.

The honest preview. Kilden is a small fleet of stateless services around four pieces of infrastructure — Kafka-compatible streaming, ClickHouse, Postgres, Redis, and S3-compatible object storage for replay:

SDKs / provider webhooks / external sources
capture ──► events_raw (keyed by distinct_id)
enricher ──► Postgres (persons, identities)
events_enriched (keyed by person_id)
│ │ │ │
▼ ▼ ▼ ▼
warehouse campaign CDP live tail
writer matcher sync │
│ │ │ ▼
▼ ▼ ▼ panel (websocket)
ClickHouse journeys destinations
(PG) → scheduler → dispatcher → email provider
provider webhooks ──────┘
(re-enter through capture)

Session replay takes a parallel path: recording chunks go to object storage, only ~200-byte pointers travel through Kafka, and an indexer builds the session index in ClickHouse.

The properties that make it operable:

  • Services are stateless — all state lives in the databases and consumer offsets, so everything scales horizontally and restarts are boring.
  • At-least-once delivery with idempotent edges — every layer can retry safely; deduplication by client-generated UUIDs makes it exactly-once where it counts.
  • One write path — every event enters through capture, so there’s exactly one thing to secure, rate-limit and monitor for ingestion.

Kilden Cloud is the hosted version of exactly this architecture — same code, same guarantees. Everything else in these docs applies to both.