Documentation · Start here
Quickstart
Bring up Kafka, Klamm, and a browser console for each of two tenants with one command.
A self-contained Compose stack runs a single-node Kafka broker, Klamm, and one Redpanda Console per tenant. Each console shows only its tenant’s view of the same underlying broker.
Bring up the stack
The Klamm image emits its own docker-compose.yml — Kafka, the proxy, and
two consoles, all wired together with inline config and secrets:
docker run --rm jerrinot/klamm:snapshot quickstart > docker-compose.yml
docker compose up -d
Klamm listens inside the Compose network on proxy:29092. The snippets
below run kcat in a one-shot
container attached to that network (klamm-quickstart), so nothing
extra needs to be installed on your host.
Open two browser tabs
- http://localhost:8080 — Kafka Console authenticated as
tenant-a - http://localhost:8081 — Kafka Console authenticated as
tenant-b
Produce and consume as each tenant
Produce a message as tenant-a:
echo "order-1 from tenant-a" | docker run --rm -i --network klamm-quickstart \
edenhill/kcat:1.7.1 -b proxy:29092 -P -t orders \
-X security.protocol=SASL_PLAINTEXT -X sasl.mechanisms=PLAIN \
-X sasl.username=tenant-a -X sasl.password=tenant-a-secret
Produce to the same logical topic as tenant-b:
echo "order-1 from tenant-b" | docker run --rm -i --network klamm-quickstart \
edenhill/kcat:1.7.1 -b proxy:29092 -P -t orders \
-X security.protocol=SASL_PLAINTEXT -X sasl.mechanisms=PLAIN \
-X sasl.username=tenant-b -X sasl.password=tenant-b-secret
Consume as tenant-a — you see only tenant-a’s own message:
docker run --rm -i --network klamm-quickstart \
edenhill/kcat:1.7.1 -b proxy:29092 -C -t orders -o beginning -e \
-X security.protocol=SASL_PLAINTEXT -X sasl.mechanisms=PLAIN \
-X sasl.username=tenant-a -X sasl.password=tenant-a-secret
Tear down
docker compose down -v
What this demonstrates
- Each tenant sees its own cluster. Both consoles are connected to the same Kafka broker through Klamm, but neither console can see the other tenant’s topics, consumer groups, or transactions.
- Logical names are unprefixed. Both tenants see a topic called
orders. The prefix appears only on the broker side. - Physical storage is shared. The broker has a single partition set for each logical topic, named with the tenant prefix.
Next steps
- Configuration examples — single broker, three-broker cluster, TLS, SNI.
- Configuration reference — every YAML option annotated.
- Limitations — what is not implemented yet.