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

Installing the CLI

taktwerk runs on Linux: x86_64, aarch64 and 32-bit hard-float ARM (armv7). One binary, taktwerk, is the engine, the CLI, the TUI, the device agent and, in a build with the http feature, the workbench backend.

From crates.io

With a Rust toolchain (1.89 or newer):

cargo install --locked taktwerk                  # engine, CLI, TUI, devices (SSH)
cargo install --locked taktwerk --features http  # also the rest and http connectors, `engine`, `serve`
cargo install --locked taktwerk --features ui    # also the web UI that `serve` and `--http` show

From a checkout: cargo install --locked --path crates/taktwerk with the same features. The examples need a C compiler.

featuredefaultadds
hostyesthe host side of devices: device, deploy, the workbench’s device pages (SSH, SFTP)
httpnothe rest and http connectors, run --http, taktwerk engine, taktwerk serve
uinohttp with the web UI embedded

Release archives

Each release carries the CLI per architecture and a SHA256SUMS file:

  • taktwerk-<version>-x86_64-linux-gnu.tar.gz
  • taktwerk-<version>-aarch64-linux-gnu.tar.gz
  • taktwerk-<version>-armv7-linux-gnueabihf.tar.gz

They hold the device engine: built with http and without host (no device, deploy), no web UI, linked against glibc 2.25 so one binary runs on older systems too. An archive holds taktwerk, the systemd unit taktwerk.service, the examples with their libraries built for that architecture (a bundle, examples/taktwerk-bundle.toml), the README and the licenses.

sha256sum -c --ignore-missing SHA256SUMS
tar xzf taktwerk-<version>-aarch64-linux-gnu.tar.gz
cd taktwerk-<version>-aarch64-linux-gnu
./taktwerk run examples/raw-pi/project.toml

The host side and the web UI come with the workbench or a build with host and ui.

Cross-building

Build on a development machine for the target with cargo-zigbuild, which links against an older glibc than the host’s so one binary runs on older target systems:

cargo install --locked cargo-zigbuild      # also needs `zig` on the PATH
rustup target add aarch64-unknown-linux-gnu x86_64-unknown-linux-gnu armv7-unknown-linux-gnueabihf

# The suffix after the target is the glibc version to link against: the oldest your targets run.
cargo zigbuild --release -p taktwerk --target aarch64-unknown-linux-gnu.<glibc>
cargo zigbuild --release -p taktwerk --target x86_64-unknown-linux-gnu.<glibc>
cargo zigbuild --release -p taktwerk --target armv7-unknown-linux-gnueabihf.<glibc>

The binaries land in target/<target>/release/taktwerk. taktwerk has no native dependencies beyond libc; its OPC UA security is pure Rust. The release archives are built this way with --no-default-features --features http and glibc 2.25 (.github/workflows/engine.yml).

Model libraries are separate files and must run on the target too: build raw libraries per architecture into lib/aarch64/, lib/x86_64/ and lib/arm/ (zig cc -target aarch64-linux-gnu.<glibc> or arm-linux-gnueabihf.<glibc> works for C), and ship FMUs with a binary for the target platform (see FMI 3). The examples’ build.sh take the compiler and the architecture from CC and ARCH:

CC="zig cc -target arm-linux-gnueabihf.<glibc>" ARCH=arm sh examples/raw-pi/build.sh

Python

The taktwerk package reads run records and campaigns and starts runs through the CLI:

pip install 'taktwerk[pandas]'      # or: uv add 'taktwerk[pandas]'