Skip to main content

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

What's there so far:

  • Cuts: grooves, dados and rabbets (through or stopped), mortises, slot mortises, tenons (haunched, mitred, chamfered, multiple side by side or across the thickness, wedged), tongues, dovetail tongues and laps, chamfers, mitres (across the face, the edge, or along the grain), tapers.
  • Joints: butt (also turned at an angle); dado, rabbet, groove and tongue and groove housings (also stopped); mortise and tenon (blind, through, stub, haunched, mitred, with mitred shoulders, multiple, wedged, tusk); loose tenons and loose tongues; bridles (L and T); half laps (plain, dovetailed, mitred), cross laps, mitred face tenons; box joints; sliding, through, half-blind, mitred-corner and blind mitred dovetails; mitre corners and splices; table-top buttons.

Example library

woodwright.examples holds over ninety examples, from single cuts through joints to projects: a try square, a mallet, a bookshelf, a dovetailed drawer with a bottom, a dining table, a side table, a chair, a step stool seat, ledged and frame-and-panel doors.

python -m woodwright.examples list
python -m woodwright.examples export projects.chair --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

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

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for woodwright 0.2.0
File Size Uploaded Provenance
woodwright-0.2.0.tar.gz 124.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for woodwright 0.2.0
File Interpreter ABI Platform
woodwright-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 202.2 kB

Release files / woodwright-0.2.0.tar.gz

Download URL woodwright-0.2.0.tar.gz
Size 124.2 kB
Tags Source
SHA-256 checksum
How to use checksums
77f021f6736eeadb784e9147d78404bb161b754f1d1de5807b23baa596ea8e1f
BLAKE2b-256 checksum
How to use checksums
b930569da0f4042ba671e2b8b7c884a460fd3c5d159a8f94ab52ca653a35c79d
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.2.0-py3-none-any.whl

Download URL woodwright-0.2.0-py3-none-any.whl
Size 78.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
36a967e1217b8553df75ffe4c45b15c3137a7df7869f9487b40c654e805872cc
BLAKE2b-256 checksum
How to use checksums
8f584b20a2c2c5d111974d191047fedd9ead8ecb75d0da5a12e041fd79408c46
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}

Security for woodwright 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page