Terminal UI for Redpanda and Kafka. Topics, consumer groups, lag, live tail with Avro / JSON-SR / Protobuf decoded inline.
Built because the Redpanda Cloud console eats my laptop.
Collapsible, grouped by dot prefix, with partitions, replication and message count.
Groupless consumer so it doesn't litter your cluster with empty groups. Per record: size, compression, format hint, headers, key, value. Decoders:
- Plain JSON / UTF-8 / hex preview.
- Confluent Avro via Schema Registry, decoded to JSON (hamba/avro).
- Confluent JSON-SR.
- Confluent Protobuf via Schema Registry, decoded to JSON. Runtime .protocompile (bufbuild/protocompile), recursive SR reference resolution, well-known types bundled, dynamicpb + protojson.
Consumer groups view with lag.
Partitions (with leader-distribution histogram), full config (non-defaults first), ACL.
Brokers view.
Needs Docker.
just demo-up
# in another terminal
just demo-traffic
go run ./cmd/readpanda --brokers localhost:19092 --sr-url http://localhost:18081
just demo-down
go install github.com/sonirico/readpanda/cmd/readpanda@latest
Or from source:
git clone https://github.com/sonirico/readpanda
cd readpanda
just install
Needs Go 1.26+. just build if you only want the binary in ./bin/.
Reads rpk profiles from the usual location
(~/Library/Application Support/rpk/rpk.yaml on macOS,
~/.config/rpk/rpk.yaml elsewhere). Set up clusters with rpk the way you
already do:
rpk profile create prod
rpk profile set kafka_api.brokers=broker1:9092,broker2:9092
rpk profile set kafka_api.sasl.user=...
rpk profile set kafka_api.sasl.password=...
rpk profile set kafka_api.tls.enabled=true
rpk profile set schema_registry.addresses=https://sr.example.com:30081
rpk profile use prod
If no separate Schema Registry credentials are configured, the kafka SASL ones are reused for SR HTTP basic auth. rpk does the same.
To bypass rpk entirely:
readpanda --brokers host:9092 --sasl-user u --sasl-pass p --tls
readpanda --sr-url https://sr.example.com:30081 --sr-user u --sr-pass p
The SR pieces also pick up READPANDA_SR_URL, READPANDA_SR_USER and
READPANDA_SR_PASS. Handy if you keep creds in a .envrc.
Global:
Topics tree: enter to expand/collapse a branch or open a leaf, o expands
all, O collapses all.
Topic detail tabs: 1 messages, 2 consumers, 3 partitions, 4 config,
5 ACL. tab cycles forward, shift+tab backward.
Tail tab: p pause/resume, c clear buffer.
.gvmrc pins Go to go1.26.3. To auto-switch on cd, add this to your
shell rc:
gvmrc_hook() {
[[ -f .gvmrc && -r .gvmrc ]] && gvm use "$(cat .gvmrc)" >/dev/null
}
autoload -U add-zsh-hook 2>/dev/null && add-zsh-hook chpwd gvmrc_hook
Or run gvm use $(cat .gvmrc) by hand after gvm install go1.26.3 -B.
Read-only. No produce, no topic creation, no ACL editing yet.
- Produce / publish from the TUI (key, value, headers; JSON, Avro and Proto via SR for the outgoing payload).
- Create / delete topics, alter partitions, alter configs.
- Inline config editing.
- Reset consumer group offsets (earliest, latest, specific, by timestamp).
- Delete dead consumer groups.
- Tail from a specific offset or timestamp (today it always starts at end).
- Per-record filter inside the tail (/regex on key/headers/value).
- Yank record to clipboard.
- Global pause/resume hotkey.
- SR bearer-token auth for from_cloud: trueprofiles (reuse the JWT incloud_auth.auth_token).
- Schemas view (:schemas): subjects, versions, source with highlighting, resolved references.
- Key decoding. Today keys are treated as strings or UTF-8; should honour the Confluent wire format too.
- Per-topic throughput (msg/s, bytes/s).
- Per-group consumption rate and ETA to head.
- Per-partition lag histogram inside group detail.
- mTLS (client cert/key, custom CA).
- SASL PLAIN and OAUTHBEARER (only SCRAM-SHA-256 today).
- --sasl-mechanismoverride.
- Context-aware help pages.
- Non-blocking toasts instead of footer-only errors.
- Remember the last-used profile across runs.
- Forced light theme / colour-blind palette.
- Tests for internal/tui/format.go,proto_decode.goand the admin list/describe paths.
- GitHub Actions CI (go vet,golangci-lint, tests).
- goreleaserfor darwin/linux x amd64/arm64 binaries.
- Tail backpressure with a real ring buffer and drop counter.
- Automatic consumer reconnection on broker drop.
cmd/readpanda/ binary
pkg/rp/ franz-go client + Schema Registry (importable lib)
internal/
profile/ rpk.yaml parser
tui/ bubbletea views, format/proto decoders
demo/ docker-compose, seed script, traffic generator, vhs tapes
pkg/rp is a regular library you can import on its own:
import "github.com/sonirico/readpanda/pkg/rp"