Skip to content

Stool

projects.stool

A stool: four round legs wedged through a solid seat, round stretchers between them; straight legs (splayed ones come later).

The seat, glued up from seat_boards boards edge to edge, its grain from side to side, is height above the floor; its arrises are chamfered all round on top. The legs' axes are leg_inset in from the seat's ends and edges; their round tenons, tenon wide, go through the seat flush with its top, each wedged in a kerf across the seat's grain, so that the wedge spreads the tenon along the grain and doesn't split the seat. The stretchers (their axes at stretcher_heights, for the front and back and for the sides) have round tenons in cross holes in the legs, the side ones higher, so that the holes don't meet.

Stool, assembled

Stool, exploded

Parameters

Parameter Default
width 360
depth 300
height 450
seat_boards 2
leg_inset 55
tenon 25
stretcher_heights (150, 190)
seat_chamfer 3
stock 30 mm board, oak

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

from woodwright.examples import projects

design = projects.stool(width=450)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Leg

leg

Seat

seat

Stretcher front back

stretcher front back

Stretcher right left

stretcher right left

Wedge

wedge

Cut list

seat                  360 x 150 x 30 mm  oak, 2 pieces: seat_1, seat_2
                      - chamfer 3 mm on top_face_left_end_arris
                      - chamfer 3 mm on top_face_right_end_arris
                      - chamfer 3 mm on top_face_front_edge_arris
                      - 2 x through hole ø25, in bottom_face, 55 and 305 from left_end; 55 from front_edge
leg                   ø40 x 450 mm  oak, 4 pieces: leg_front_left, leg_back_right; mirror image: leg_front_right, leg_back_left
                      - chamfer 2 mm around left_end
                      - round tenon ø25, 30 long, a saw kerf 2 mm, 20 deep, for a wedge, on right_end
                      - hole ø16, 27 deep, in bottom_face, 150 from left_end, centered
                      - hole ø16, 27 deep, in back_edge, 190 from left_end, centered
wedge                 20 x 6 x 24 mm  oak, 4 pieces: wedge_front_left, wedge_front_right, wedge_back_right, wedge_back_left
                      - taper 2 mm on front_edge towards right_end
                      - taper 2 mm on back_edge towards right_end
stretcher_front_back  ø25 x 260 mm  oak, 2 pieces: stretcher_front, stretcher_back
                      - round tenon ø16, 25 long, on left_end
                      - round tenon ø16, 25 long, on right_end
stretcher_right_left  ø25 x 200 mm  oak, 2 pieces: stretcher_right, stretcher_left
                      - round tenon ø16, 25 long, on left_end
                      - round tenon ø16, 25 long, on right_end

Code

From woodwright/examples/projects.py, which imports the names it uses (see From an example to your own design):

def stool(
    width: float = 360,
    depth: float = 300,
    height: float = 450,
    seat_boards: int = 2,
    leg_inset: float = 55,
    tenon: float = 25,
    stretcher_heights: tuple[float, float] = (150, 190),
    seat_chamfer: float = 3,
    stock: Stock = THICK_OAK,
) -> Assembly:
    """A stool: four round legs wedged through a solid seat, round stretchers
    between them; straight legs (splayed ones come later).

    The seat, glued up from `seat_boards` boards edge to edge, its grain
    from side to side, is `height` above the floor; its arrises are
    chamfered all round on top. The legs' axes are `leg_inset` in from the
    seat's ends and edges; their round tenons, `tenon` wide, go through the
    seat flush with its top, each wedged in a kerf across the seat's grain,
    so that the wedge spreads the tenon along the grain and doesn't split
    the seat. The stretchers (their axes at `stretcher_heights`, for the
    front and back and for the sides) have round tenons in cross holes in
    the legs, the side ones higher, so that the holes don't meet.
    """
    floor = orient(at=(0, 0, height - stock.thickness), top_face=UP, back_edge=BACK)
    asm = Assembly("stool", root_location=floor)
    seat = [
        asm.add(Board(f"seat_{i + 1}", stock, length=width, width=depth / seat_boards))
        for i in range(seat_boards)
    ]
    for a, b in itertools.pairwise(seat):
        asm.join(Butt(a.back_edge, b.front_edge))
    for board in seat:
        sides = [board.left_end, board.right_end]
        sides += [
            edge
            for edge, outer in [(board.front_edge, seat[0]), (board.back_edge, seat[-1])]
            if board is outer
        ]
        for side in sides:
            board.cut(Chamfer(board.arris(board.top_face, side), size=seat_chamfer))
    legs = _wedged_legs(
        asm,
        seat,
        height - stock.thickness,
        (leg_inset, leg_inset),
        tenon,
        kerf=2,
        flare=2,
        wedge_length=20,
    )
    front_back, sides = stretcher_heights
    spans = [
        ("stretcher_front", 0, front_back),
        ("stretcher_right", 1, sides),
        ("stretcher_back", 2, front_back),
        ("stretcher_left", 3, sides),
    ]
    between = (width - 2 * leg_inset, depth - 2 * leg_inset)
    _rod_stretchers(asm, legs, spans, between, tenon=16)
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.