No install

The released binary, in your browser, on a live stream

Every session here is a real shell in a throwaway container, running the same checksum-verified tarball you would download, pointed at the live demo topics: orders at about 25 events a second, payments trailing each order by one to eight seconds. Results are JSON lines on stdout, so pipe them through jq, redirect them to a file, replay that file. The history is preloaded - press ↑ and the queries below are ready to run. Fifteen minutes, read-only, yours.

ubik@demo

A real container, fifteen minutes, no signup.

A windowed aggregate

Five-second tumbling windows over the order stream. A fresh session first chews through the retained hour of backlog - a few seconds of work - then sits on the live edge and emits a row per merchant per window.

paste it
ubik --from kafka://demo.getubik.dev/orders \    "SELECT merchant, TUMBLE(ts, INTERVAL '5' SECOND) AS w,            count(*) AS orders, round(sum(amount), 2) AS total     FROM orders GROUP BY merchant, TUMBLE(ts, INTERVAL '5' SECOND)"

A stream-stream join

Each payment lands one to eight seconds behind its order, so the interval join matches most of them and skips the rest; the missing ids are the orders nobody paid.

paste it
ubik --from kafka://demo.getubik.dev/orders \    --stream payments=kafka://demo.getubik.dev/payments \    "SELECT o.order_id, o.merchant, p.status     FROM orders o JOIN payments p       ON o.order_id = p.order_id      AND p.ts BETWEEN o.ts AND o.ts + INTERVAL '10' SECOND"

The pool is capped; past the cap you get a live queue position instead of a refusal. A session sees the demo broker and nothing else - no internet, no neighbours. Same stream, from your own machine: docs/kafka/demo-stream.