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.
| feature | default | adds |
|---|---|---|
host | yes | the host side of devices: device, deploy, the workbench’s device pages (SSH, SFTP) |
http | no | the rest and http connectors, run --http, taktwerk engine, taktwerk serve |
ui | no | http 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.gztaktwerk-<version>-aarch64-linux-gnu.tar.gztaktwerk-<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]'