VernierCAD
VernierCAD is a local Linux parametric solid modeller using Rust, an OCCT kernel, and a native Wayland-capable winit window. It is GPL-3.0-or-later.
Install a local release
Provide a release directory containing executable vernier-app and
vernier-worker. A local installed release requires both binaries. The installer
accepts RELEASE_DIR VERSION HEX_COMMIT and installs without modifying the source
checkout:
scripts/install-local.sh RELEASE_DIR VERSION HEX_COMMIT
~/.local/bin/vernier
The installer stores binaries under
~/.local/share/vernier/releases/<commit>, atomically updates current, keeps
the prior target as previous, and writes a desktop entry. It checks executable
bits and missing shared libraries with ldd. Existing user data and releases
owned by another commit are preserved. Use --dry-run to inspect destinations;
use --prefix DIR for a self-contained staging prefix.
Before activation, install under a staging prefix and run the installed-worker
file-commands-actual and local-linux-release driven workflows, including
save/reopen and STEP/STL export. Then run the staged native launcher with
VERNIER_READBACK. The driven harness supplies interaction evidence through the
real app core and staged worker; native readback proves native launch/render only,
not pointer or keyboard injection into the Wayland window. Move current only
after both evidence paths pass.
The launcher does not depend on the checkout or a working directory. It keeps
the current log and one rotated log under
${XDG_STATE_HOME:-~/.local/state}/vernier/logs. It does not force an obsolete
X11 backend; native Wayland is the intended path.
Basic workflow
The Projects dashboard opens on launch. Choose New for an empty managed project, or Open to register an existing native document. Choose a sketch plane, draw a closed profile, and extrude it. Select faces or edges for available modelling operations, then use Save to write the native document. Open restores a saved document. Switching projects uses Save/Discard/Cancel; Cancel leaves the current document untouched. Duplicate creates an independent copy, and Archive hides a library entry without deleting its files. Recovery state is offered after an interrupted session through the app's recovery controls.
The current alpha covers sketching, constraints, extrude, editing, direct
modelling, and the delivered multi-body core. Loft is end-to-end in the GUI;
advanced guided lofts, G1/G2 endpoint matching and periodic closure are not
available. Back up both the .vernier document and its .vernier.names sidecar.
Managed projects and recovery stay under
${XDG_STATE_HOME:-~/.local/state}/vernier/{projects,recovery}; installation and
rollback do not move them.
To roll back, stop VernierCAD, inspect ~/.local/share/vernier/previous, and
replace current with that managed target atomically, for example:
root=${XDG_DATA_HOME:-$HOME/.local/share}/vernier
if [ -L "$root/previous" ]; then
ln -sfn "$(readlink "$root/previous")" "$root/current.rollback" &&
mv -Tf "$root/current.rollback" "$root/current"
else
echo "No previous local release is installed."
fi
The same paths under DIR/share/vernier apply to a --prefix DIR install.
Development checks
For a source checkout, use the workspace's normal Rust commands:
fish scripts/check-fast.fish # everyday development feedback
fish scripts/check.fish # exhaustive release gate
cargo run --release -p vernier-cli --features system-occt -- --selftest # 46 end-to-end checks, JSON report on stdout
--selftest runs 46 end-to-end checks headlessly and writes a JSON report; the
driven-GUI gate in scripts/check.fish runs all registered workflows after it.
The full gate builds the release driver, worker and CLI once, then invokes those
binaries directly. GUI workflows still run twice in separate processes, compare
every frame digest, check exported geometry and PNG goldens, and require RADV.
Rust unit tests and the dedicated recovery tests retain their debug checks.
Each full-gate command prints its duration and exit code, and records them in a
unique target/gate/timings-*.tsv file (seconds, exit code, command). Sort that
file with sort -nr to find the slowest stages. The gate still stops at the first
unexpected failure; a negative control must return exactly 1. A cold release
build costs more than a warm run, so compare those timings separately.
The acceptance manifest explicitly enables system-occt on every Cargo step
that compiles code. The OCCT development libraries, a C++ toolchain, and a
Vulkan driver are therefore needed for normal local development and CI.
Release builds use the pinned, statically linked OCCT source instead. Prepare
it once, then build without system-occt:
scripts/build-vendored-occt.sh target/vendored-occt
VERNIER_OCCT_STATIC_ROOT="$PWD/target/vendored-occt" \
cargo build --locked --release -p vernier-app \
--bin vernier-app --bin vernier-worker
scripts/check-static-occt.sh \
target/release/vernier-app target/release/vernier-worker
There is no implicit fallback from this release path to host OCCT. See
docs/VENDORED_OCCT_RELEASE.md for the pin,
closure, resource environment, and verification contract.