woodwright
A semantic CAD library for woodworking. You describe furniture the way a woodworker thinks about it: boards with named sides, and the joints between them. woodwright works out the joinery, the cut sizes and where every part goes, and produces 3D models (STEP, STL), drawings (SVG) and cut lists.
It is built on build123d. This is an early alpha: the API will still change.
Installation
pip install woodwright # or: uv add woodwright
Requires Python 3.14. Source: https://github.com/bzamecnik/woodwright
Quickstart
A rail tenoned into a stile. You give the design dimensions and the joint; the tenon, the mortise, the rail's cut length and its placement are derived.
from pathlib import Path
import woodwright as ww
from woodwright.export import export_model
oak = ww.Stock.board(thickness=20, species="oak")
frame = ww.Assembly("corner", root_location=ww.orient(right_end=ww.UP, back_edge=ww.RIGHT))
stile = frame.add(ww.Board("stile", oak, length=600, width=60))
rail = frame.add(ww.Board("rail", oak, length=300, width=60)) # shoulder to shoulder
frame.join(ww.MortiseTenon(tenon=rail.left_end, mortise=stile.back_edge))
model = frame.resolve()
print(model.cut_list())
export_model(model, Path("output/corner")) # STEP, STL, SVG views, cut list
stile 600 x 60 x 20 mm oak
- mortise 50 x 8 mm, 42 deep, in stile.back_edge
rail 340 x 60 x 20 mm oak
- tenon 50 x 8 mm, 40 long, on rail.left_end
Cuts and joints so far: grooves, dados, rabbets, mortises, tenons (haunched, mitred), chamfers, mitres, tapers; butt, dado, rabbet, groove, tongue and groove, mortise and tenon, bridle, half lap, cross lap, mitre corners and splices, sliding, through and half-blind dovetails, and table-top buttons.
Example library
woodwright.examples holds over fifty examples, from single cuts through
joints to projects: a try square, a mallet, a bookshelf, a dovetailed drawer
with a bottom, a dining table.
python -m woodwright.examples list
python -m woodwright.examples export projects.table --out output
The design ideas are in docs/vision.md and docs/plan.md.
Development
Install the environment and dependencies:
uv sync
pre-commit install # ruff lint + format on commit
Optionally, for notebooks with an interactive 3D viewer:
uv sync --group notebook
uv run jupyter lab
Run the tests and the linters:
uv run pytest
uv run ruff format
uv run ruff check --fix
License
Credits
- Ideas and guidance: Bohumír Zámečník
- Most of the implementation: Claude Code (Opus 5.5)
Metadata
Release files for woodwright 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| woodwright-0.1.0.tar.gz | 69.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| woodwright-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 113.4 kB
Release files / woodwright-0.1.0.tar.gz
| Download URL | woodwright-0.1.0.tar.gz |
|---|---|
| Size | 69.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6e98c779189d602cd06ccee4ced9910669f02ad7bcd93935096e4d91133d0bc9
|
|
BLAKE2b-256 checksum How to use checksums |
75ab89f6915d0143e5be23dbb9db7414de346e28c5563de8d6f9c97c26c741e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / woodwright-0.1.0-py3-none-any.whl
| Download URL | woodwright-0.1.0-py3-none-any.whl |
|---|---|
| Size | 44.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ca9222b1472a98f06342dc74607ad966440c9fe4cf104b0e91c9e6e4c9a728b7
|
|
BLAKE2b-256 checksum How to use checksums |
a2f5f0425854494ff820cabe78f84e2e2e6dddd3516c5a1c1f91191bea501696
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|