Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Installation

Clinker is a single static binary with no runtime dependencies. Download it, put it on your PATH, and you are ready to go.

Binaries

Clinker ships two binaries:

  • clinker – the pipeline executor. This is the main tool you use to validate and run pipelines against data.
  • cxl – the CXL expression checker, evaluator, and formatter. Use it during development to test expressions interactively, check types, and format CXL blocks.

Verify installation

After placing the binaries on your PATH, confirm they work:

clinker --version
clinker 0.1.0
cxl --version
cxl 0.1.0

Both commands should print a version string and exit. If you see command not found, check that the directory containing the binaries is in your PATH.

Building from source

Clinker requires Rust 1.91+ (edition 2024). If you have a Rust toolchain installed, build and install both binaries directly from the repository:

# Clone the repository
git clone https://github.com/rustpunk/clinker.git
cd clinker

# Install the pipeline executor
cargo install --path crates/clinker

# Install the CXL expression tool
cargo install --path crates/cxl-cli

This compiles release-optimized binaries and places them in ~/.cargo/bin/, which is typically already on your PATH.

To verify the build:

cargo test --workspace

This runs the full test suite (approximately 1100 tests) and confirms everything is working correctly on your system.

Rust toolchain

The repository includes a rust-toolchain.toml that pins the exact Rust version. If you use rustup, it will automatically download the correct toolchain when you build.

RequirementValue
Rust edition2024
Minimum version1.91
C dependenciesNone

A working C compiler is not one of the requirements: nothing in the build graph runs one. TLS for the rest source and the OTLP exporter goes through rustls with the graviola provider, which ships as Rust and inline assembly rather than the C and per-architecture assembly that other providers build, and content hashing uses blake3’s pure-Rust SIMD paths. CI builds the workspace, including its test and benchmark targets, with every C-compiler environment variable pointed at a program that fails, so a dependency that starts needing one is caught rather than noticed by whoever first builds without a compiler installed. That job also builds a crate that deliberately compiles C and requires it to fail, so the check is known to still work and not merely to be passing.

Graviola supports x86_64 and aarch64. Those are the architectures Clinker is built and tested on; another one needs a different rustls provider, and the ones available today build C.

Optional capabilities

Three parts of Clinker are Cargo features of the clinker crate. All three are on by default — a downloaded binary, or one built with plain cargo install --path crates/clinker, has every one of them, and nothing in this documentation assumes otherwise.

FeatureWhat it adds
restThe rest source transport (transport: rest on a source node).
otlpOTLP/HTTP export of logs, metrics and spans to a collector.
lineageOpenLineage emission: --lineage and --lineage-events.

They exist for deployments that want a smaller binary or a narrower dependency graph — a build with no rest and no otlp links no HTTP client and no TLS stack at all:

# File sources and lineage only: no network transport is compiled in.
cargo install --path crates/clinker --no-default-features --features lineage

A build without a capability still parses every construct the full one does. What it will not do is run one silently: a pipeline that declares a rest source, a clinker.toml that sets observability.otlp.endpoint, or a --lineage flag is refused at validation — before any source is opened or any output written — with a diagnostic that names what was asked for and says the capability is not in this binary.

Turning otlp off also stops telemetry being recorded: the fixed arena is reserved for an exporter to drain, so with no exporter there is nothing to reserve it for, and the --machine ndjson-v1 terminal then carries no observability field at all.