Wakes a Kafka broker. No JVM to put to bed.
Part of the doze family. Works alone.
A native broker that boots in milliseconds, sits quiet until a client connects, keeps your data on disk, and shuts down cleanly. One Go binary, single node: no JVM, no ZooKeeper, no KRaft quorum, no Docker.
$ doze-kafka broker 127.0.0.1:9092 console http://127.0.0.1:9093/_console/ $ kcat -b 127.0.0.1:9092 -t orders.placed -P $ kcat -b 127.0.0.1:9092 -t orders.placed -C -e {"order_id": "[id]", "total": "[amount]"}
See every record. And why it's there.
Topics, the tape of records on disk, messages decoded, and underneath, the requests that touched them. On by default.

The real console, from its demo stack: 40 records produced with kcat. re-capture with Larder
If your client can't tell, it's Kafka.
Built to behave like Kafka to any client on the socket, and to leave out what no client can observe. Five things, one at a time.
On its own, or inside a doze stack.
The same broker either way. On its own it answers on loopback, so nothing on your network can reach it. Inside doze it gets a name, so two projects can both have their 9092.
One command, on loopback.
Run doze-kafka: the broker listens on 127.0.0.1:9092 and its console on 127.0.0.1:9093/_console/. Linux and macOS, amd64 and arm64, Intel Macs included.
$ doze-kafka broker 127.0.0.1:9092 console http://127.0.0.1:9093/_console/ ^C # topics, messages and offsets are there next time
The topics are the contracts.
doze add kafka, and in Larder, our made-up example project, doze names it kafka.larder.doze. Services in Go, Python and TypeScript (franz-go, confluent-kafka, KafkaJS) talk through four topics declared in doze.hcl, not created by whichever client writes first. doze itself needs Apple silicon on a Mac.
# doze.hcl, from the Larder example module kafka "kafka" { version = 4 port = 9092 auto_create_topics = false topic "users.signed-up" { partitions = 3 } topic "orders.placed" { partitions = 3 } topic "payments.settled" { partitions = 3 } topic "payments.failed" { partitions = 3 } } # and in each app that uses it KAFKA_BROKERS = module.kafka.address
What it isn't, on purpose.
A single node for development, not production. Anything a client can't observe through the socket is left out.
- No replication, ISR or controller quorum
- No byte-for-byte on-disk segment compatibility
- No tiered storage or quotas
Apache Kafka is a trademark of the Apache Software Foundation. doze Kafka is not affiliated with it.
Part of the doze family. Works alone.
Three products, each its own download, each happy on its own. Together, doze runs the other two inside your stack and gives them names.