Free, on a couple of conditions

Get Ubik

Closed source, and free for personal, non-commercial and evaluation use under the PolyForm Noncommercial licence. Commercial use takes a paid licence, priced on pricing.

Linux x86_64 and macOS arm64, macOS 12 or later. Three ways in, and the shortest is Homebrew.

homebrew
brew tap magiclex/ubikbrew trust magiclex/ubikbrew install magiclex/ubik/ubikubik versionubik 0.0.4ubik-engine 0.0.4

The trust step is not optional and not ours: Homebrew refuses to load a formula from a tap you have not explicitly trusted. Update with brew upgrade ubik.

In a notebook, the engine runs inside your own process. The install name is ubik-sql and the import stays ubik: the short name on PyPI belongs to an unrelated package from 2020.

python
pip install ubik-sql
notebook
import ubik ubik.stream(    "SELECT k, TUMBLE(ts, INTERVAL 1 MINUTE) AS w, sum(v) AS s "    "FROM events GROUP BY k, TUMBLE(ts, INTERVAL 1 MINUTE)",    from_="kafka://localhost:9092/events",).arrow()

Or the tarball, for a machine that has neither. The checksum line is part of the install, not a footnote: it is the same SHA256 the binary verifies for you on every later ubik upgrade.

linux x86_64
curl -fsSLO https://getubik.dev/releases/v0.0.4/ubik-0.0.4-linux-amd64.tar.gzcurl -fsSL https://getubik.dev/releases/v0.0.4/SHA256SUMS \    | sha256sum -c --ignore-missingubik-0.0.4-linux-amd64.tar.gz: OKtar -xzf ubik-0.0.4-linux-amd64.tar.gz./bin/ubik versionubik 0.0.4ubik-engine 0.0.4
macos arm64
curl -fsSLO https://getubik.dev/releases/v0.0.4/ubik-0.0.4-darwin-arm64.tar.gzcurl -fsSL https://getubik.dev/releases/v0.0.4/SHA256SUMS \    | shasum -a 256 -c --ignore-missingubik-0.0.4-darwin-arm64.tar.gz: OKtar -xzf ubik-0.0.4-darwin-arm64.tar.gz./bin/ubik versionubik 0.0.4ubik-engine 0.0.4

Intel macs and Linux arm64 are not built yet. Leave an email and you get one message when they land, nothing else.

Once it is on your machine, a durable job is one command. Name the pipeline, let the CLI supervise it, and it resumes from its last checkpoint across a restart.

pipeline
ubik pipeline create txns \    --from kafka://localhost:9092/txns \    --to   kafka://localhost:9092/txn_counts \    "SELECT merchant,            TUMBLE(event_time, INTERVAL 1 MINUTE) AS window,            count(*) AS n     FROM txns     GROUP BY merchant, TUMBLE(event_time, INTERVAL 1 MINUTE)"ubik pipeline start txnsubik pipeline list  NAME   STATUS   PID     FROM            TO