Newest first, in the words of the release itself. Every build ships signed, with its checksum published on the download page.
v0.4.0
WoodWright 0.4.0 - the first public build (take 2: the overlay is comment-free)
Tauri validates the merged config against a strict schema, so the public
overlay carries no "//" key - the first run died on "Additional properties
are not allowed" before anything was built or uploaded. The overlay is now
documented in RELEASING.md instead of in itself.
WoodWright now stands entirely on its own. A fresh install lands on a
welcome with three ways in: draw the room you measured, open the starter
kitchen (a real sample job - nest it, print it, take it apart), or start
a blank job. Jobs live as WoodWright's own .ww files under
Documents\WoodWright\Jobs, and every job card on Home draws its own plan
picture.
New in the shop:
- Door profiles cut from real router-bit geometry - chamfers, roundovers,
coves, ogees, beads for edges, stickings and panel raises - beside the
Conestoga catalog set in Setup > Door Style.
- Attach two cabinets that get screwed together on site: share an end,
run a stile past the seam, and the shared panel carries the neighbour's
shelf-pin and hinge boring on its far face for the bench.
- Grab a face-frame member's edge in the 3D and drag it - snaps to the
quarter inch, the floor, the ceiling, the neighbour, the wall end.
- Add your own parts to any cabinet (stretchers, nailers, cleats, panels)
with honest joinery, and delete or resize what the recipe gave you.
- The corner cabinet's shelves are carved to fit inside its backs - the
3D, the cut list and the sheet all show the same shape.
Under the hood: one derivation drives the 3D, the cut list, the sheets
and the G-code; the full test gate is 137 suites green.
v0.3.5
0.3.5 — every thickness is a knob, the bleeds are gone, the setup sheet prints, and any router can run the sheets
Fixed — the parameter bleed:
- Opening a job put its parameter overrides in the wrong place: they landed
in the app's storage but the engine kept deriving with the LAST job's
values, and the first edit wrote those back over the new job's — the
"parameters bleed between jobs" you reported. And on start-up, loading
your saved method wiped the job's overrides seconds after they applied.
Both fixed: a job's overrides reach the engine the moment it opens, a job
without any inherits none, and start-up keeps them.
Materials — every family has its thickness now:
- CASE stock ½ · ⅝ · ¾ (Setup ▸ Materials & Finish ▸ Case; the WWCaseT
parameter). Ends, deck, top, stretchers, partitions, nailers, toe boards
and shelves follow — every joint, groove and toe with them. Proven at ⅝
over the whole cabinet matrix AND all 443 real cabinets: no two parts
share space, every groove is filled, every bore has a purpose, no note
lies. The Interior follows the case (one thickness in the engine); a
⅝ melamine case with prefinished-maple interiors takes melamine interiors
too (prefinished isn't sold in ⅝) and says so.
- DRAWER BOX stock ½ · ⅝ · ¾ (WWDrawerBoxT) — sides, front and back; the ¼
bottom stays. Unset = the style's own: ⅝ for the dado box, ½ for your
butt-joint box, so neither changes until you say. A ½ box now nests and
prices as ½ stock (it was called ⅝).
- "Shop defaults" on the Materials card clears every thickness parameter —
back to what the method and the style say, never a ¾ pinned as a value.
- The Draftsman reads the job's material picks every turn (it drafts and
talks in your materials instead of asking twice).
Cabinets — THE PLACEMENT BAR:
- Where a cabinet is and how big it is now lives in ONE place: a bar under
the drawing (plan · elevation · 3D) whenever you click a cabinet, an
appliance or a placed prop — W · H · D · Elev · X + the wall picker, and
the QUICK SNAPS: Left / Right (slides to the neighbour on that side or
the wall's end — a window at cabinet height, a range, a doorway are
neighbours; an overlapping cabinet lands on the nearest free spot),
Center on the wall, Center on… what sits above or below it (a hood
centers on the range, a sink base on the window, a wall cabinet on the
base under it — one candidate is instant, more offers a list), Stretch
L / R to the neighbour, Top = / Bottom = level with the nearest cabinet,
⋯ island · attach · duplicate · delete. Every snap is one click, undoable,
and says what it did ("#3 against #2 Sink Base — moved 8″ left"). Arrow
keys nudge the selection 1/16″ (Shift = 1″; ↑↓ elevation). Escape leaves
a field first, then the selection.
- The right rail slims to what is per-cabinet and deep — Ends & panels ·
Toe · Back · Appearance · Hardware · Construction — and starts a little
wider. Nothing lives in two places.
- A blind corner's buried width matches the cabinet that butts into it (the
inspector names it and offers the number in one click).
Sheets & CNC:
- PER-PART MACHINING: right-click a part on a sheet → grooves at the bench ·
bores at the bench (and back). The sheet drops them, the program drops
them, the bench list names them, and it rides the job. When a groove has
no bit, the refusal now tells you this is the way out.
- STOCK PER MATERIAL: under the sheet preset, each material class in play
picks its own sheet — 5×10 melamine beside 4×8 prefinished beside 5×5
baltic. The run header says which; the cards, the programs and the buy
follow. A ½ drawer box nests as "Drawer stock 1/2 (baltic)" — its own
class, its own sheet; ⅝ keeps the label your cost book prices by.
- THE SETUP SHEET PRINTS WITH THE LAYOUT. Print ▸ Sheet layouts (and the job
packet): every sheet's page now carries a setup band under the material
header — the load rule as a picture (the marked corner is 0,0 · top face
up · grain along X), the program's name with a QR, the machine, the stock
and its MEASURED thickness, every T word the program calls with Ø / rpm /
feed, the counts (parts · bores · dados · tabs), the parts that come off
machined-face-down, anything rotated across the grain — the program's own
facts, the same ones in the .txt saved beside it. If no program can be
built yet the band says the one reason (no machine · stock not mic'd ·
refused: …). Under the key: 🔧 the sheet's bench work, and the drops
worth racking.
- THE SHEETS SAY WHEN THEY ARE STALE. Nest, then change a cabinet, a material
or a parameter, and the Sheets page says so above the runs — "6 parts
changed since this nest ran: 6 resized — these sheets show the job as it
WAS", each part named (added · removed · resized · moved stock, from →
to), with Re-nest now. A print of a stale nest carries the same warning
across every page. Nothing is re-nested behind your back.
- CUT-READINESS: one card at the top of the runs says whether the sheets
are ready to cut and, if not, exactly why — a stale nest (Re-nest now),
parts that don't fit the stock, no machine enabled, parts with no stock
class, stock not mic'd ("mic it" jumps to the run), the bench count.
Green reads "ready to cut — 8 sheets". Nothing is blocked; the G-code
window says THE NEST IS STALE in red, and Save asks "cut anyway?".
- YOUR ROUTER: four new machine cards under Sheets ▸ Machines — Generic
router · Mach3/Mach4 (.tap; Avid, Laguna, most 4×8 kits), GRBL 1.1 (.nc;
Onefinity, Shapeoko, LongMill), LinuxCNC (.ngc), Masso G3 (.nc). Tick
yours, pick program units (mm or inches), where Z zero is (the table —
safer — or the top of the stock) and how tools change (T M6, or an M0
pause that names the bit), and the same programs the SCM gets are written
in your control's G-code — the same toolpath, translated move for move,
then read back and compared before you see it. Bores on a router with no
drilling head: a same-size drilling bit pecks; a bigger hole (a 35 hinge
cup) is helix-bored with a smaller bit; if nothing in your library can
make the hole the sheet refuses and names the bit to add. Every card
says it: no shop has run one of these on iron yet — verify on scrap first.
Settings — the shop travels, and files go where you say:
- SHOP BACKUP: Settings ▸ Shop backup exports ONE .wwshop file with
everything that lives only on this computer — the tool library and
machines, parameter sets, materials and stock, the cost book, your
library, the remnant rack, the folders, the letterhead, the Draftsman
settings (never your sign-in). Import it on a new PC or after a reinstall,
ticking which sections to take; the app reloads with them. A chip says how
long since the last backup.
- FOLDERS: Settings ▸ Folders — CNC programs, exports (CSV / GLB / 360° /
renders) and part DXFs each land beside the job as always, or in a folder
you choose (the machine's share, a CAM watch folder, the office server),
with a subfolder per job or flat. The Documents page lists whatever folder
is set; the toasts name it.
- "Open in viewer" on the Documents page opens the file again — the app
had never been granted permission to open a path with the OS, only web
links; it is now.
The Draftsman:
- The meter shows the LAST TURN's bill beside this chat's running total
("$12.40 in credits · this chat $0.62 · last turn $0.18") — the number a
small shop steers by, seen the moment it lands.
- Its map of the app caught up with the week: ask "how do I…" about
parameter sets, the Materials card, the Overview tab, the placement bar,
the tool library, the bench list, stock per material, the setup band, the
stale banner, the router cards or the readiness card and it names the real
control.
Under the hood (RELEASING.md): CUTLIST-DIFF-0.3.4-to-0.3.5.md — 0 of 104 real
cabinets moved; 127 suites green; a sweep preload runs every suite at ⅝ case
stock (scripts/tools/sweep-preload.mjs) — the physics laws hold there too.
v0.3.4
0.3.4 — parameter sets, materials, the tool library, and the corner squared away
Setup:
- MATERIALS — what the parts are cut from. Setup ▸ Materials & Finish has a
Materials card: five rows (Case · Interior · Backs · Fronts & frame · Drawer
boxes), two boxes each — the nominal thickness (¾ · ½ · ¼: the stock's
NAME, never the mic'd number, which stays on the Sheets page) and the
species / ply type: prefinished maple or birch ply, unfinished birch /
maple / oak / walnut / cherry, melamine white or woodgrain TFL, MDF,
particleboard, baltic birch, solid hardwood. A pick renames the cut list's
material column and splits the Sheets runs (a melamine interior never
shares a sheet with a prefinished case); the backs' and fronts' thickness
IS the parameter (WWBackT / WWFrontT). Where the engine cuts one thickness
today (case ¾, interior ¾, drawer boxes ⅝) the chip says so — no menu the
cut list would ignore. Shop defaults keep every label you already price by.
Cabinets:
- FINISHED ENDS run to the frame's bottom — 3½ off the floor with a 4" toe
and a 1¼ rail — whether applied, ¼ skin, or the FLUSH end itself (the deck
dies into a groove that far up). Unfinished ends still sit on the deck.
Walls never hang. (Cut lists: an applied panel / flush end +½ long.)
- THE 45 CORNER: wall A's back runs to the chamfer and wall B's back from the
chamfer's end (it sat 1⅜ toward the corner — ~2" of bare wall at the
return end); the void panel seats between the wall backs' inner faces and
no longer pokes through wall B; the toe's front board runs end board to
end board (it stopped ~1.9" short of each). Toe cross members hang from
the deck (the gap is at the floor).
- OVERVIEW — the first tab in the cabinet editor: the whole cabinet with its
doors and hardware ON, chips to show or hide layers (Box · Frame · Fronts ·
Interior · Hardware · Toe · End panels; Alt+click solos one), an EXPLODE
slider, Home. Per cabinet.
- If one cabinet can't be built, the 3-D no longer dies: a translucent red
stand-in the cabinet's size stands in and a toast names it ("#4 Tall: …").
Counters:
- The top runs OVER a dishwasher, trash compactor (new 15" entry) or
under-counter fridge between two bases; ranges still stop it. A corner
cabinet joins its two walls' runs — the L has no void; a 45 corner's slab
follows the diagonal door and its overhang (a polygon, not two boxes).
Sizes, edge and area in the takeoff match. And over the real jobs, every
base cabinet is under a slab: a narrow product inside a wider box (an end
panel, a filler stile) used to shorten the run's slab and split the run;
a panel's stored "depth" no longer sizes the top.
Sheets & CNC:
- MACHINES: the programs name the machine (SCM N100 · Xilog Plus · .xxl · 5×10
bed); a checkbox per machine (untick = nothing posts, and it says why);
"Tell us about your machine →".
- Bench work per run: 🔧 the parts the machine doesn't finish (the far face,
anything the note sends to the bench), in the part's own words.
- The sample job's Prefinished ¾ run refused one sheet ("tab floor: #1
Back…") — the tab recovery dropped the wrong part's tabs. Fixed; every
sheet of the sample posts.
The Draftsman:
- COST: the conversation now caches (breakpoint on the last message) — a
small task that read $1.95 was paying full price for its own history every
turn; the meter shows "this chat $x.xx".
- EYES, restrained: inspectGeometry (free, exact — every part with its box,
what shares space, what leaves the envelope, two labelled drawings) for
checks; and the LOOK — a real picture, framed on one cabinet
(three-quarter with the rest ghosted, or straight on), rationed. Settings ▸
The Draftsman ▸ Pictures per turn (0–4, default 2).
Under the hood (RELEASING.md): the corpus cut-list diff (12 of 104 real
cabinets moved, every line a ruling above); 117 suites green; the tool
library's migration and the tab-floor fix are pinned by tests.
v0.3.3
WoodWright 0.3.3
Money:
- A 45° corner quoted TWO doors whenever its face said "pair" and cut ONE.
It quotes one now; a pie-cut quotes its bifold pair.
- A test now holds the quote's counts against the cut list on every real
cabinet, so the two cannot drift apart again.
The sheet buy and the router:
- The toe platform's cross member, the corner's wall backs and nailers, and
the corner shelf were unclassified — flagged on the Sheets page and left
OFF the sheets and the router while the cut list billed them. Routed with
their cousins. Every part name now has to land in a bucket (a test).
Multi-bay cabinets (a stile between two bays — every drawer bank beside a
door, every three-bay wall cabinet). These CHANGE CUTS:
- A bay machines only the end it reaches. The middle bay's shelf pins were
bored into BOTH ends (where no shelf of its ever rests); a 4-drawer row
bored both ends for all four drawers, four times over.
- The flush-out partition behind a stile carries the machining of the bays
beside it — shelf-pin rows, fixed-shelf grooves, slide pilots — on the face
each bay sees. It was a bare board; the door bay's shelves rested on pins
two bays away, the drawer bank's slides ran on nothing.
- The flush-out runs deck-top to top-underside when its stile does (a case
part, like a partition), so the grooves cut for it in the deck, the
stretchers and the top actually receive it — they received nothing, and
the top-side ones were on the wrong face and 3/4" off besides.
- Two panels behind a stile only when two panels fit: your 1 1/8" centre
stile was getting two 3/4" "twins" that overlapped each other by 3/8".
Narrower than 1 1/2" → one panel, centred.
- Shelves, nosings and drawer boxes size off the flush-out's face, not the
frame's opening line (a shelf was entering the panel's groove 3/16 instead
of 3/8).
- A door shorter than about 8" takes one hinge, centred (a 7 1/2" door was
getting two cups 1 1/2" apart).
Boring:
- A line-bored column no longer drills through a fixed shelf's groove (a
10mm pin in what is left of 3/4 stock after a 3/8 dado breaks through the
finished face).
- One partition through a drawer bank over doors carries BOTH bays' boring —
it had the runner pilots and none of the shelf pins, so the shelves below
had nothing to rest on at the partition.
- The Specs page's Boring picture names every hole on hover (shelf pin,
hinge plate pilot, slide pilot, cup, dowel) and counts them by purpose
under each card.
Parameters:
- BackTopScribe reads per class now (the wall and tall siblings were hidden
and never read). Audit: 180 parameters move something, 54 claimed-wired
ones do not, 0 base/wall/tall asymmetries left.
v0.3.2
0.3.2 — the parameter truth release
The saw gets it right more often:
- A wall cabinet is a wall cabinet because it HANGS, not because it hangs high —
three low-hung uppers were being cut with base rails.
- Backs are plain squares when the groove runs through. The Back panel says why.
- Notches that were only words on the cut sheet are cut now (baseboard, hang
rail, the 45 corner's end inset).
- A part you reshape in the Studio sits where you drew it, and the grooves that
receive it follow.
- No two parts share space, and nothing sticks out of its cabinet: a sweep boxes
every part against every other and against the cabinet. It caught frameless
shelves and drawer boxes cut off the front opening instead of the case (1" too
long — they could not go in), a deck running 3/4" into an applied end panel,
and frameless corner doors 3/8" taller than the box. All fixed.
- Every groove receives a part: a second sweep maps each groove into the cabinet
and checks something sits in it. The partition grooves on the stretchers and
the top were on the wrong face of the board (the partition comes from below)
and 3/4" from the partition. Fixed. A part machined only on its underside (a
top, a back stretcher) is drawn machined-face-up so the sheet and the router
agree; a part machined on BOTH faces (a lit upper's deck) sends the underside
work to the bench, and says so.
- Hinge-plate pilots go on the side the door hangs on. A single door hinged left
was boring the right end too.
The back, in your words (this one CHANGES A CUT on every cabinet):
- ONE question for the back — "Back — how it goes in": in grooves (the shop),
inside the box butt-jointed (no bigger than the opening, for CNC-less
building), or plant-on. On the Specs page and per cabinet in the inspector.
- An island's finished back sits INSIDE the depth you type (24 typed = 24 built,
panel included), so walkways measure true on the plan.
The toe kick, in your words:
- One question — manual, into the ends, or separate parts — plus a plain
cross-member switch, one every 24", 3 1/2" tall, four setbacks, and a front
board that can run long toward a corner. A separate platform is a four-sided
box (front, back, an end board at each end, members between). Each board is a
real part; the 3D draws the platform — the 45's five-piece and the pie-cut's
L platform too, and a manual toe draws none. (The 45 was billing its back toe
boards twice.)
- A framed corner cabinet was 3/4" deeper than the cabinet beside it. It lines
up now.
The Specs page tells the truth:
- 61 settings nothing reads are hidden. A setting that can't matter yet says so
on its row, and why. "Commonly changed" shows the ones this shop actually uses.
Also: drawer boxes as a purchase line (bought) or cut — including your 1/2" butt
box with the runner notch; applied end panels held 1/32 shy of the frame; shelf
pin count is a live knob; the interior editor can put a partition behind any
stile, and no longer hides a ghost shelf in a drawer bank; the chimney's three
numbers are fields; oak plates grown off your own boards; the update chip pops
when a release lands.
Everything above is pinned by 99 test suites, all green locally including the
six that read the real jobs.
v0.3.1
WoodWright 0.3.1 — ink, the side-panel law, and per-cabinet customisation made legible
The first release that arrives on its own: 0.3.0 was the last hand install.
v0.3.0
WoodWright 0.3.0 — the first release that can update itself
Auto-update: the app checks dl.woodwright.app 45 seconds after launch and every
six hours, downloads in the background, and installs only when you say so. It
never restarts itself — this app holds unsaved rooms and billed Draftsman runs.
Ink: near-black is the interactive colour, warm neutrals, and the only saturated
pixels left on screen are the ones that mean something.
This is the last version that has to be installed by hand.