Skip to content

Bookshelf

projects.bookshelf

Two sides with a top and a bottom in rabbets and a middle shelf in dados.

Outside sizes; the shelves' design length is between the sides.

Bookshelf, assembled

Bookshelf, exploded

Parameters

Parameter Default
height 800
width 500
depth 250
stock 20 mm board, oak

Change them in a design file (see Change an example):

from woodwright.examples import projects

design = projects.bookshelf(height=1000)

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  800 x 250 x 20 mm  oak, 2 pieces: left, right
            - end rabbet 20 mm, 10 deep, in bottom_face at right_end
            - end rabbet 20 mm, 10 deep, in bottom_face at left_end
            - dado 20 mm, 6.5 deep, in bottom_face
top_bottom  480 x 250 x 20 mm  oak, 2 pieces: top, bottom
shelf       473 x 250 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 bookshelf(
    height: float = 800,
    width: float = 500,
    depth: float = 250,
    stock: Stock = OAK,
) -> Assembly:
    """Two sides with a top and a bottom in rabbets and a middle shelf in dados.

    Outside sizes; the shelves' design length is between the sides.
    """
    t = stock.thickness
    asm = Assembly("bookshelf", root_location=CASE_SIDE)
    # Both sides have their reference faces outside and reference edges at
    # the front, so they are mirror images; both have their right end up.
    left = asm.add(Board("left", stock, length=height, width=depth))
    right = asm.add(Board("right", stock, length=height, 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))
    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(RabbetJoint(rabbet=side.bottom_face, end=top_end, at=side.right_end))
        asm.join(RabbetJoint(rabbet=side.bottom_face, end=bottom_end, at=side.left_end))
        asm.join(
            DadoJoint(
                dado=side.bottom_face, end=shelf_end, position=offset(height / 2, side.right_end)
            )
        )
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.