Skip to content

Repository files navigation

Kora

A Confluent-compatible Schema Registry, built in Rust.

PostgreSQL storage · Single binary · Sub-millisecond lookups · Zero JVM overhead

License: MITghcr.io

Why Kora?

ConfluentKarapaceKora
StorageKafka topicKafka topicPostgreSQL
RuntimeJVMPythonNative (Rust)
Kafka dependencyRequiredRequiredNone
API compatibilityReferencePartial100% wire-compatible

Existing serializers, connectors, and CLI tools work without modification.

Quick Start

# 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"}

Install

Helm (recommended)

helm install kora oci://ghcr.io/popsink/kora/charts/kora \
--set database.host=my-postgres.example.com \
--set database.password=secret

See chart/README.md for all options.

Docker

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

Configuration

VariableDefaultDescription
DATABASE_URL(required)PostgreSQL connection string (postgres://…). If empty, composed from the DB_* components below
DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_NAMEConnection components used when DATABASE_URL is empty (DB_PORT defaults to 5432)
HOST0.0.0.0Server bind address
PORT8080Server listen port
MAX_BODY_SIZE16777216Maximum request body size in bytes
DB_POOL_MAX20Maximum database connections
RUST_LOGinfoLog 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.

API

Kora implements the full Confluent Schema Registry REST API — Avro, JSON Schema, and Protobuf with all 7 compatibility modes.

Development

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 recipes

License

MIT

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages