This version is still in development and is not considered stable yet. For the latest stable version, please use Korvet 0.19!

Run the Demo

The korvet demo command starts a complete, self-contained Korvet showcase with a single command. It is the fastest way to see how the broker, web UI, and tiered storage work together.

Prerequisites

  • Install Korvet — on macOS and Linux, brew install redis/tap/korvet.

  • A way for the demo to reach a module-enabled Redis 8+ — one with the RedisJSON (JSON.*) commands. Any of: a module-enabled Redis already running, a module-enabled redis-server binary on your PATH (the Redis Open Source cask provides one; see Install), or Docker. The demo tries them in that order.

    The Homebrew core redis formula ships without that module, so a redis-server from it is not sufficient — the demo would skip it and fall back to Docker. For a Docker-free run, install the module-enabled cask (brew install --cask redis).

Start the demo

brew install redis/tap/korvet
korvet demo

This single command:

  1. Resolves Redis — reuses a module-enabled Redis already running at redis://localhost:6379, otherwise starts a throwaway local redis-server (only if it is module-enabled), otherwise falls back to a redis:8 Docker container.

  2. Starts the broker and web UI in-process, pointed at a local-filesystem Iceberg cold tier under /tmp/korvet-demo.

  3. Resets any previous demo state on a reused Redis (demo topics, consumer groups, and their cold-tier catalog tables), so every run starts clean. Pass --no-fresh to keep the previous run’s data instead.

  4. Creates the e-commerce demo topics — a tiered clickstream topic (3 partitions) with a short segment.ms so data reaches the cold tier within seconds, tiered orders and payments topics derived from purchases, and a compacted inventory topic that keeps only the latest stock level per product.

  5. Streams synthetic JSON e-commerce events while two consumer groups read them: analytics (two members) on the clickstream, and fulfillment — a deliberately slow consumer on orders, so the UI’s lag view has real motion.

On an interactive terminal the demo shows a full-screen live dashboard. When output is piped or --verbose is set, it prints a plain walkthrough and streams logs to the console instead.

What you’ll see

Kafka bootstrap

127.0.0.1:9092 — connect any Kafka client or app here

Web UI

http://localhost:8080 — explore topics, messages, consumer groups, and lag

Iceberg cold tier

/tmp/korvet-demo — watch the warehouse fill as segments offload

The demo uses 127.0.0.1 instead of localhost for the Kafka bootstrap address. This ensures compatibility with dual-stack clients (kcat, confluent-kafka) that resolve localhost to IPv6 ::1 first, where the demo’s loopback-only listener is not bound.

In the web UI, explore:

  • The clickstream, orders, payments, and inventory topics and their JSON messages. inventory is compacted — only the latest stock level per product survives.

  • The analytics and fulfillment consumer groups — members, partition assignment, committed offsets, and lag. fulfillment reads slowly on purpose, so its lag visibly grows.

  • The cold-tier warehouse filling up as sealed segments offload to Iceberg, then evict their local copies after local.retention.ms (2 minutes in the demo).

On the live dashboard, press p to pause/resume the producer and c to stop one analytics consumer and watch the group rebalance. The header shows cold-tier health: how many segments have offloaded, or a red indicator if offloads are failing.

Once Parquet files appear, query the cold tier directly with DuckDB:

duckdb -c "INSTALL iceberg; LOAD iceberg; SET unsafe_enable_version_guessing=true; \
  SELECT count(*) FROM iceberg_scan('/tmp/korvet-demo/korvet/clickstream');"

Useful options

--records <count>

Produce a fixed number of events, or 0 to stream continuously (default).

--rate <events/sec>

Approximate produce rate. Default: 50.

--timeout <duration>

Auto-shutdown after a duration, e.g. 10m.

--kafka-port / --http-port

Override the broker and UI ports (default 9092 / 8080).

--redis-uri <uri>

Reuse a Redis already running at this URI.

--no-fresh

Keep a previous demo run’s topics, groups, and cold-tier state on a reused Redis instead of resetting them.

--topic / --partitions

Name and partition count of the clickstream topic (default clickstream / 3).

--data-dir <dir>

Directory for Redis data and the Iceberg warehouse. Default: /tmp/korvet-demo (reset each run).

--verbose

Stream full broker and Kafka-client logs instead of the live dashboard.

Stop the demo

Press Ctrl-C. Redis, the broker, and the web UI all shut down cleanly.

Next steps