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

--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.

S
Description
No description provided
Readme GPL-3.0
18 MiB
Languages
Rust 95.9%
C++ 3.1%
Shell 0.6%
Python 0.3%