The connector ships as a single static binary (musl) with the React UI embedded. No runtime, no host dependencies.
The repo’s docker-compose.yml brings up Postgres (TimescaleDB), ClickHouse, NATS, and
the connector together:
git clone https://github.com/Opex-Technologies-Pte-Ltd/opex-connector.git
cd opex-connector
cp apps/connector/config.example.yaml config.yaml # edit devices + push_endpoint
docker compose up -d # UI + API on :3000cargo build --release
# default: modbus,opcua,nats,http,mqtt,clickhouse,postgres,transform,static-ui,focas,mtconnect,ethernetip
# opt-in: telemetry (/metrics + OTel), pi, cloud-client e.g. --features telemetry,pi (not --all-features)
./target/release/opex-flow config.yamlBuild the UI first (cd apps/ui && bun run build, or ./scripts/build.sh): it is embedded at compile time. Feature flags are additive: build only the adapters you ship to the edge to keep the
binary small. The JavaScript transform layer is the transform feature; the DSL needs no
extra feature. A config section for an adapter that is not compiled in still parses, but enabling
it fails validation (for example “adapters.focas is enabled but this build lacks the focas
feature”), so a slim binary never silently ignores a source.
Fanuc CNCs (FOCAS)
The focas feature is on by default and needs no Fanuc library: the built-in pure-Rust FOCAS/Ethernet
client (adapters.focas.mode: native, beta) runs in every release, including the static musl Linux
builds, aarch64 (Raspberry Pi) and macOS. If you own Fanuc’s FOCAS2 library, put it beside the binary
or set adapters.focas.lib_path (Windows fwlib30*.dll, glibc Linux libfwlib32-linux-*.so, renamed
or symlinked to end in .so); with the default mode: auto the library is used when it loads and
native otherwise. To see it without hardware, add a device with simulator: true or run
opex-flow focas-sim. Details and the not-yet-verified points are in Sources.
To check a real controller, run opex-flow focas-probe --host <cnc-ip> [--library <FOCAS2 library>] [--out <dir>].
It is read-only: it reads everything the native client implements, prints the values to compare with the CNC
screen, saves a JSON report and a raw frame capture, and, given a library, diffs the library’s values against the
native ones (exit code 1 on a difference). The field procedure is docs/focas-field-test.md in the repository.