Skip to content

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.

Dovetail shelf, assembled

Dovetail shelf, exploded

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):

from woodwright.examples import projects

design = projects.dovetail_shelf(height=625)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Left right

left right

Shelf

shelf

Top bottom

top bottom

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.