Dovetail shelf¶
projects.dovetail_shelf
A shelf of two stories: a case through-dovetailed at its four corners and a middle shelf in dados; outside sizes.
The sides have pins at both ends, the top and the bottom tails, so the tails show on the sides. The sides' and the top's design lengths are shorter by the boards they reach through.
Parameters¶
| Parameter | Default |
|---|---|
height |
500 |
width |
400 |
depth |
200 |
tail_count |
3 |
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¶
left_right 500 x 200 x 20 mm oak, 2 pieces: left, right
- 2 x sockets for 3 dovetails
- dado 20 mm, 6.5 deep, in bottom_face
top_bottom 400 x 200 x 20 mm oak, 2 pieces: top, bottom
- 2 x 3 dovetails, slope 1:7
shelf 373 x 200 x 20 mm oak
Code¶
From woodwright/examples/projects.py, which imports the names it uses (see From an example to your own design):
def dovetail_shelf(
height: float = 500,
width: float = 400,
depth: float = 200,
tail_count: int = 3,
stock: Stock = OAK,
) -> Assembly:
"""A shelf of two stories: a case through-dovetailed at its four corners
and a middle shelf in dados; outside sizes.
The sides have pins at both ends, the top and the bottom tails, so the
tails show on the sides. The sides' and the top's design lengths are
shorter by the boards they reach through.
"""
t = stock.thickness
asm = Assembly("dovetail_shelf", root_location=CASE_SIDE)
left = asm.add(Board("left", stock, length=height - 2 * t, width=depth))
right = asm.add(Board("right", stock, length=height - 2 * t, width=depth, mirror=True))
top = asm.add(Board("top", stock, length=width - 2 * t, width=depth))
bottom = asm.add(Board("bottom", stock, length=width - 2 * t, width=depth, mirror=True))
shelf = asm.add(Board("shelf", stock, length=width - 2 * t, width=depth))
for side, top_end, bottom_end, shelf_end in [
(left, top.left_end, bottom.left_end, shelf.left_end),
(right, top.right_end, bottom.right_end, shelf.right_end),
]:
asm.join(ThroughDovetail(tails=top_end, pins=side.right_end, tail_count=tail_count))
asm.join(ThroughDovetail(tails=bottom_end, pins=side.left_end, tail_count=tail_count))
asm.join(
DadoJoint(
dado=side.bottom_face,
end=shelf_end,
position=offset((height - 2 * t) / 2, side.right_end),
)
)
return asm
Exported with woodwright 0.9.0 on 2026-10-25.