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.
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.
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.
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.