Skip to content

clink v0.4.0

Choose a tag to compare

@orhaugh orhaugh released this 29 Jul 23:23
· 479 commits to main since this release

A small, focused release: a new connector, prebuilt Linux binaries, the
coordinator serving the real ops console same-origin, and one crash fix
that lean builds of v0.3.0 need. No REST API or format breaks.

Full notes: CHANGELOG.md.

Consume a release without a compiler

Every release now carries a prebuilt Linux x86_64 SDK:

curl -fsSLO https://github.com/orhaugh/clink/releases/download/v0.4.0/clink-v0.4.0-linux-x86_64-ubuntu24.04.tar.gz
tar xzf clink-v0.4.0-linux-x86_64-ubuntu24.04.tar.gz
./clink-v0.4.0-linux-x86_64-ubuntu24.04/bin/clink run pipeline.sql

A relocatable prefix - the clink CLI and clink_node daemon, static
libraries, headers and the CMake package, with the pinned Arrow bundled and
$ORIGIN rpaths - so both the CLI and find_package(clink) work straight
out of the tarball (-DCMAKE_PREFIX_PATH=<extracted dir>). Built at an
honest Ubuntu 24.04 glibc floor (the name says so) and smoke-tested
from a clean directory as both a CLI and a linked consumer before upload.
Scope is the dependency-free impl set: SQL, file/Parquet, RocksDB state,
HTTP, TLS, WebSocket, Avro, vector search. Object stores (s3://, ...) and
broker connectors remain source-build territory, where they are on by
default.

WebSocket source

connector='websocket' connects to a ws:// or wss:// push feed - the
delivery mechanism of most market-data and event APIs - sends the venue's
subscribe message, and emits each text message as a record. A declared
format='json' schema rides the columnar JSON decode exactly as a Kafka
table does. RFC 6455 is implemented in-tree over POSIX sockets, pinned in
tests to the RFC's own worked examples, adding zero dependencies (wss
uses OpenSSL when present). Delivery is stated plainly: a push stream has
no offsets, so at-most-once across restarts - bridge to Kafka for
durability, or pair with the flight recorder to make an unreplayable feed
locally replayable. Verified against a real venue: one inline clink run
statement pulls live trades off a public exchange stream through TLS into a
file - the one-liner is in
docs/connectors/websocket.md.

The coordinator serves the real console

The embedded dashboard SPA - a hand-rolled page predating the
clink-fe ops console - is removed.
In its place, clink_node --http-static-dir=<dir> serves any built console
bundle (clink-fe's dist/) same-origin at / beside the JSON API: one
port, no CORS setup, no separate web server, with SPA deep-link fallback
and a traversal-guarded, unit-tested resolver. Without the flag, /
answers with a JSON signpost. Every /api/v1 route, /metrics, the SSE
stream, auth and CORS are untouched.

Crash fix for lean builds

v0.3.0 crashed at CLI startup (In not registered) in any build without
the Iceberg impl: vector_search registered its Row-channel operator without
registering the Row type, which Iceberg's install had been masking in full
builds. Fixed by idempotent self-registration; found by
market-pulse, the downstream
consumer showcase, whose CI builds exactly that subset. The Iceberg impl
also now skips itself cleanly against an Arrow built without S3 instead of
poisoning every consumer link.

Artifacts

  • Linux SDK: clink-v0.4.0-linux-x86_64-ubuntu24.04.tar.gz (+ .sha256), attached below.
  • pyclink wheel (macOS 14+, Apple silicon, self-contained): pyclink-0.4.0-py3-none-macosx_14_0_arm64.whl, sha256: 8ff797acf364fc76e2b694c290211b14799519e7e81f2371cd5d1c90ea1dbac3. The v0.2.0 caveats carry over (no object-store filesystems, no HTTPS in the HTTP subsystem).
  • Runtime image: ghcr.io/orhaugh/clink-runtime:0.4.0 (also :latest).