rpi-provision Declarative first-boot provisioning for Raspberry Pi 5 SD cards Source on GitHub

0003. The desktop front end lives in a separate workspace

Context

ADR 0001 says the workspace carries no external dependencies, and CI enforces it by checking that Cargo.lock never lists a package that is not a workspace member. That property is what makes the library and the command line buildable anywhere with nothing but a Rust toolchain — no openssl-sys, no vendored C, no network during the build.

A desktop application cannot be written that way. Drawing a window means a toolkit, and every candidate brings hundreds of transitive crates:

Decision

The application lives in gui/, which is a Cargo workspace of its own, excluded from the root workspace. It depends on crates/spec, crates/render and crates/apply by path, and on Tauri from crates.io.

Consequently:

The dependency arrow only ever points inwards. Nothing under crates/ may depend on anything in gui/, and no type crosses the boundary that the command line does not already use.

Consequences

Alternatives considered

Relax ADR 0001 and put the GUI in the main workspace. The simplest arrangement, and it would have cost the property that makes the tool easy to build and audit. The reason for ADR 0001 does not weaken because a second front end exists.

Ship the GUI as a separate repository. It would keep this one clean, at the price of version skew between the front end and the crates it drives, and a second place to make every change. The boundary needed is between dependency trees, not between repositories.

A terminal UI instead. No dependencies, works over SSH — and not what was asked for. It remains available as an addition rather than as a substitute.

Revisit if