A Confluent-compatible Schema Registry, built in Rust.
PostgreSQL storage · Single binary · Sub-millisecond lookups · Zero JVM overhead
| Confluent | Karapace | Kora | |
|---|---|---|---|
| Storage | Kafka topic | Kafka topic | PostgreSQL |
| Runtime | JVM | Python | Native (Rust) |
| Kafka dependency | Required | Required | None |
| API compatibility | Reference | Partial | 100% wire-compatible |
Existing serializers, connectors, and CLI tools work without modification.
# docker-compose.ymlservices:
postgres:
image: postgres:17-alpineenvironment: { POSTGRES_DB: kora, POSTGRES_USER: kora, POSTGRES_PASSWORD: kora }kora:
image: ghcr.io/popsink/kora:latestdepends_on: [postgres]environment: { DATABASE_URL: "postgres://kora:kora@postgres:5432/kora" }ports: ["8080:8080"]docker compose up -d
curl http://localhost:8080/health
# {"status":"UP"}helm install kora oci://ghcr.io/popsink/kora/charts/kora \
--set database.host=my-postgres.example.com \
--set database.password=secretSee chart/README.md for all options.
Images are published as :<version> / :latest (static musl, amd64 + arm64).
:<version>-postgres / :latest-postgres remain as aliases to the same digest
so existing pins keep working.
docker run -p 8080:8080 -e DATABASE_URL="postgres://user:pass@host:5432/kora" ghcr.io/popsink/kora:latest| Variable | Default | Description |
|---|---|---|
DATABASE_URL | (required) | PostgreSQL connection string (postgres://…). If empty, composed from the DB_* components below |
DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAME | — | Connection components used when DATABASE_URL is empty (DB_PORT defaults to 5432) |
HOST | 0.0.0.0 | Server bind address |
PORT | 8080 | Server listen port |
MAX_BODY_SIZE | 16777216 | Maximum request body size in bytes |
DB_POOL_MAX | 20 | Maximum database connections |
RUST_LOG | info | Log level (error, warn, info, debug, trace) |
DEFAULT_COMPATIBILITY | (unset) | Default global compatibility level, re-applied to the global config on every startup — overwriting any runtime PUT/DELETE /config change to the global level. One of BACKWARD, BACKWARD_TRANSITIVE, FORWARD, FORWARD_TRANSITIVE, FULL, FULL_TRANSITIVE, NONE. Leave unset (default) to let the runtime API own the level (BACKWARD on a fresh install) |
Schema migrations run automatically on startup.
Kora implements the full Confluent Schema Registry REST API — Avro, JSON Schema, and Protobuf with all 7 compatibility modes.
The toolchain is defined by devbox (see
devbox.json + rust-toolchain.toml):
pinned Rust, just, k6, and psql. You also need
Docker for the database containers.
# Install devbox: https://www.jetify.com/docs/devbox/installing_devbox/# In VS Code, the integrated terminal opens directly into `devbox shell` (see# .vscode/settings.json), so the toolchain is ready to go.# Elsewhere, run `devbox shell` once (or prefix a command with `devbox run --`).
just dev # Run locally (starts PG via Docker Compose)
just test# Run all tests
just ci # fmt + lint + test (same as CI)
just -l # List all recipesMIT