Loose tenon¶
joints.loose_tenon
A rail joined to the back edge of a stile by a loose tenon.
The loose tenon is a strip of 8 mm oak glued into a mortise in the stile's edge and one in the rail's end, half its length in each, as cut with a router or a domino jointer (the mortises here square-ended).
Parameters¶
| Parameter | Default |
|---|---|
stile_length |
600 |
rail_length |
300 |
width |
60 |
tenon_length |
50 |
tenon_width |
40 |
stock |
20 mm board, oak |
Change them in a design file (see Change an example):
Drawings¶
The plans in one PDF: plans.pdf.
Cut list¶
stile 600 x 60 x 20 mm oak
- mortise 40 x 8 mm, 27 deep, in back_edge
rail 300 x 60 x 20 mm oak
- mortise 40 x 8 mm, 27 deep, in left_end
loose_tenon 50 x 40 x 8 mm oak
Code¶
From woodwright/examples/joints.py, which imports the names it uses (see From an example to your own design):
def loose_tenon(
stile_length: float = 600,
rail_length: float = 300,
width: float = 60,
tenon_length: float = 50,
tenon_width: float = 40,
stock: Stock = OAK,
) -> Assembly:
"""A rail joined to the back edge of a stile by a loose tenon.
The loose tenon is a strip of 8 mm oak glued into a mortise in the
stile's edge and one in the rail's end, half its length in each, as cut
with a router or a domino jointer (the mortises here square-ended).
"""
asm = Assembly("loose_tenon", root_location=STANDING)
stile = asm.add(Board("stile", stock, length=stile_length, width=width))
rail = asm.add(Board("rail", stock, length=rail_length, width=width))
tenon_stock = Stock.board(thickness=rules.tenon_thickness(stock.thickness), species="oak")
tenon = asm.add(Board("loose_tenon", tenon_stock, length=tenon_length, width=tenon_width))
asm.join(LooseTenon(stile.back_edge, rail.left_end, tenon))
return asm
Exported with woodwright 0.9.0 on 2026-10-25.