
Structor was the Roman architect and engineer whose De architectura is the oldest surviving work on the discipline — the book that gave design its three tests: firmitas, utilitas, venustas — soundness, usefulness, beauty. A CAD module that exists to design real parts for a real shop takes the name of the man who first wrote down what a design owes the person who builds from it.
CAD, sovereign. Solids in, drawings out.
Debian 13 / Ubuntu 24.04+ — install with sudo apt install ./structor_0.11.0_amd64.deb
All modules and docs: https://github.com/3DJ77/Livyatan

sudo apt install ./structor_0.11.0_amd64.deb
structor
Click a palette button (top-left) — BOX / SPHERE / CYLINDER / WEDGE /
PYRAMID — to drop a solid on the plate. New parts (and the cube a fresh
scene opens with) arrive at one inch, 25.4 mm; GEAR is sized by its
teeth and module. Left-drag moves it; rings rotate; grab the
bounding-box handles to scale (corners = uniform, faces = one axis).
EXPORT STL writes the scene to STL.
SAVE (Ctrl+S) writes a .SigN file,
OPEN (Ctrl+O) loads one — both through the file dialog,
default folder ~/Structor.
Structor is the design module of the Livyatan Design Suite: a sovereign, local-first CAD program in Rust on fyrox. It is an alternative to online cloud-based CAD platforms — drop primitive solids on a build plate, drag/rotate/scale them with gizmos, mark negatives as holes, group and boolean-merge, then export the resolved solid to a watertight STL. No browser, no cloud, no account, no network. Everything runs on the local machine.
The scene is a tree of shapes that maps 1:1 onto a JSON-CSG grammar,
so a saved .SigN file is a readable spec, not an opaque
blob. Boolean preview and merge use the manifold engine — the same
backend OpenSCAD uses — so what you preview is what the export
produces.
The installed binary is /usr/bin/structor. 85 in-crate
tests (cargo test); the camera/spacemouse canon tests live
in the vendored chimaera crate.
Structor is Latin for builder — the worker who raises the structure, and the root the word “structure” itself grew from. In Rome a structor was the tradesman on the wall, not the patron with the drawings: the one whose hands had to make the plan true. A CAD module that exists to design real parts for a real shop takes the builder’s name, not the architect’s.
.SigN.50 Tab 20 Tab 3 Enter.Structor — bracket.SigN *,
the star while unsaved. Closing with unsaved changes writes the autosave
first, then asks whether to save to the scene’s file.BOX 3 · 25.40 × 25.40 × 25.40 mm · 2 hidden), the part
under the cursor lights up, and the wheel zooms toward the cursor.~/.config/livyatan/ui-scale; restart to
apply.~/.config/structor/backdrop.json when the
window closes (and when the carpet is switched off) and comes back next
launch; SIG_BG_X/Y/Z/YAW/PITCH/ROLL set the launch
defaults. Copy/paste with Ctrl+C/Ctrl+V.SIG_IMPORT=<path> at
launch; meshes are welded, normalized, and grab-editable; imported-mesh
dims (X/Y/Z, display order — 2026-08-31) live in the inspector and are
per-axis (2026-09-04): typing W, H or D scales only that axis, the other
two hold, and the part’s pins ride the same scale..SigN
(JSON-CSG: units, solids, colors, pins, groups, fab tags) through a save
dialog the first time and silently to the same file after; OPEN / Ctrl+O
loads one (undoable). Default folder ~/Structor.
SIG_OPEN=<path> still loads at launch.~/Structor/autosave.SigN; the status line says
so. A previous session’s autosave is announced in the DEBUG feed at
launch — OPEN it if you need it.~/.config/structor/nav.json, edited live in the NAV
panel.Place and edit solids. Click a palette button; the part lands on a free grid cell. Click to select (repeat-click cycles overlapping parts). Left-drag moves on the workplane with grid + surface snap; arrows nudge by the grid step (Shift ×5, Ctrl+Shift+Up/Down raises/lowers). Type exact values in the left inspector; Enter commits. Drag a ring to rotate (compass shows the snapped angle; ROT° box in TOOLS applies typed degrees). Drag a corner handle for uniform scale, a face handle for one axis — it grows toward you, Esc puts everything back. T opens the TOOLS panel: GRID step, TRANSFORM (scale/rotate ±90°/mirror), ALIGN, SNAP, colors, backdrops.
Booleans. Select a part, press H to mark it a hole. P previews the cut without committing. Select the hole plus its solids and Ctrl+G to apply the boolean — the result is one merged, still-editable part; Ctrl+U brings the sources back. Ctrl+W welds any multi-selection into one part in a single stroke.
Save and export. SAVE / Ctrl+S writes
.SigN (dialog on the first save, default
~/Structor/, then silently to that file); OPEN / Ctrl+O
loads one. EXPORT STL in the toolbar opens a save dialog (defaulting to
~/Desktop) and writes the boolean-resolved solid — exactly
what the P preview shows — as binary STL. Any part that is not manifold
is named in the status line and excluded from the merge rather than
silently dropped.
Navigate. Right-drag or left-drag empty space =
orbit. Middle-drag = pan (the scene follows the cursor). Wheel = zoom
(scroll up backs the camera away). WASD pans the view. Home (or H with
nothing selected) = home view. With the SpaceMouse: tilt = fly,
push/pull = lift, twist = yaw. Hold Shift for the
attitude layer — tilt L/R = roll, tilt F/B = pitch, fly gated off. Hold
L-Alt to boost fly speed (SIG_FLY_BOOST,
default 6×). Left puck button = home.
The NAV panel. If any axis feels backwards, don’t
relaunch with env flips — open the NAV panel and fix it there:
per-function sign flips, gesture-source reassignment, puck sensitivity,
fly speed, and the mouse feel block (orbit/zoom/ pan sens + direction).
Every click writes ~/.config/structor/nav.json. Load order:
baked default ← nav.json ← SIG_* env (env wins, as launch
trim).
The DEBUG pane. Edge tab or C opens it; drag the left grab bar to resize. The feed (newest first) records every status transition — imports, exports, merges, welds — and is copyable with Ctrl+C. UNITS toggles mm/in display.
chimaera/, vendored crate) —
the camera, interaction-math, and spacemouse crate. Nav canon tests live
there; edit viewport feel THERE.~/.config/structor/nav.json carries every
sign/source/sensitivity; the mouse block carries
orbit/zoom/ pan sens and direction.Env is launch-time trim; the NAV panel / nav.json is the durable home for feel.
| Variable | Default | Effect |
|---|---|---|
SIG_OPEN |
— | Load a .SigN scene at launch |
SIG_IMPORT |
— | Load an STL/OBJ mesh at launch |
SIG_UNITS |
mm | in starts the UNITS toggle in inches |
SIG_SPACEMOUSE_SENS / _DEADZONE |
crate defaults | Puck sensitivity / deadzone |
SIG_SPACEMOUSE_HIDRAW |
auto | Force a specific /dev/hidraw* node |
SIG_ORBIT_SENS / SIG_ZOOM_SENS /
SIG_PAN_SENS |
1.0 | Mouse feel multipliers |
SIG_FLY_SPEED |
1.0 | Fly speed multiplier |
SIG_FLY_BOOST |
6.0 | L-Alt fly multiplier |
SIG_WHEEL_SIGN |
1.0 | Hardware wheel trim only — canon is fixed |
SIG_TILT_SIGN SIG_STRAFE_SIGN
SIG_LIFT_SIGN SIG_YAW_SIGN
SIG_ROLL_SIGN SIG_PITCH_SIGN |
baked | ±1 per-axis trim; overrides nav.json |
SIG_SNAP_R |
grid_step × 0.5 | Feature-snap catch radius |
SIG_COOP_W |
340 | DEBUG pane width (clamp 240–720) |
SIG_BG_YAW / SIG_BG_PITCH /
SIG_BG_ROLL |
0 | Backdrop orientation |
SIG_BG_LIFT |
400 | Backdrop dome lift (clamped 0–600) |
SIG_SSAO |
off | 1 re-enables SSAO (off: it bands the skydome) |
SIG_INPUT_TRACE |
off | set (any value) to print WHEEL/PAN input events to stderr |
Not for operators — read only by the test suite
(cargo test); the shipped binary never consults them.
| Variable | Default | Effect |
|---|---|---|
SHOP_TEST_DIR |
$TMPDIR/structor-whips-e2e |
Directory the shop-export end-to-end test writes its MANIFEST/BOM/cut files into, so a developer can inspect the output |
.SigN round-tripgroups array
(index-aligned like colors/pins/fab) and restore on load.The model is truth: dimensioned drawings and machine cut files come FROM the scene (the shop-export design note; first customer = the WHIPS gasifier).
hephaestus profile --inside (comp rides INTO a hole;
without it every hole comes out one kerf oversize) — the manifest says
so next to the files. CNC/PRINT/CAST STLs are re-origined: centered on
X/Y, resting on Z=0 — they land in a slicer/CAM at the origin, not
wherever the part sat on the plate.shop-<epoch>/: per-part DXF R12 + Hephaestus boundary
JSON + letter-landscape SVG sheet (FLAT/ROLLED), per-part STL
(CNC/PRINT/CAST), plus bom.csv and
MANIFEST.txt. Untagged parts are skipped loudly; geometry
errors abort the whole export (no partial truth).Not built yet. Listed so nobody mistakes them for missing bugs.
.SigN file-open picker.SigN);
Ctrl+A still selects them.