Skip to content

Stepstool

projects.stepstool

A step stool: the seat of stepstool_seat on four round legs, which go through the battens and the seat, wedged; straight legs (splayed ones come later).

The legs stand under the middle of the battens, their axes leg_inset in from the front and the back. Their shoulders bear on the battens; the tenons, tenon wide, go through a hole bored through each batten and on through the seat, flush with its top, wedged across the seat's grain. The tenons cross the battens' grain, so that the battens hold the seat's boards. A round stretcher under each batten, its axis stretcher_height above the floor, joins the front and the back leg.

Stepstool, assembled

Stepstool, exploded

Parameters

Parameter Default
height 250
length 400
depth 280
batten_width 90
batten_inset 30
leg_inset 50
tenon 25
stretcher_height 90
stock 20 mm board, oak

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

from woodwright.examples import projects

design = projects.stepstool(height=312.5)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Batten

batten

Leg

leg

Seat

seat

Stretcher

stretcher

Wedge

wedge

Cut list

seat       400 x 140 x 20 mm  oak, 2 pieces: seat_1, seat_2
           - 2 x dovetail socket 86.75 mm at the face, 6.5 deep, 1:4, in bottom_face
           - 2 x through hole ø25, in bottom_face, 75 and 325 from left_end; 50 from front_edge
batten     280 x 90 x 26.5 mm  oak, 2 pieces: batten_left, batten_right
           - dovetail tongue 86.75 mm wide at the shoulder, 6.5 deep, 1:4, on top_face
           - through hole ø25, in bottom_face, 50 from left_end, centered, for the tenon on leg_front_left.right_end
           - through hole ø25, in bottom_face, 230 from left_end, centered, for the tenon on leg_back_left.right_end
leg        ø40 x 250 mm  oak, 4 pieces: leg_front_left, leg_front_right, leg_back_right, leg_back_left
           - chamfer 2 mm around left_end
           - round tenon ø25, 40 long, a saw kerf 2 mm, 15 deep, for a wedge, on right_end
           - hole ø16, 27 deep, in back_edge, 90 from left_end, centered
wedge      15 x 5 x 24 mm  oak, 4 pieces: wedge_front_left, wedge_front_right, wedge_back_right, wedge_back_left
           - taper 1.5 mm on front_edge towards right_end
           - taper 1.5 mm on back_edge towards right_end
stretcher  ø25 x 190 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 stepstool(
    height: float = 250,
    length: float = 400,
    depth: float = 280,
    batten_width: float = 90,
    batten_inset: float = 30,
    leg_inset: float = 50,
    tenon: float = 25,
    stretcher_height: float = 90,
    stock: Stock = OAK,
) -> Assembly:
    """A step stool: the seat of `stepstool_seat` on four round legs, which go
    through the battens and the seat, wedged; straight legs (splayed ones
    come later).

    The legs stand under the middle of the battens, their axes `leg_inset`
    in from the front and the back. Their shoulders bear on the battens;
    the tenons, `tenon` wide, go through a hole bored through each batten
    and on through the seat, flush with its top, wedged across the seat's
    grain. The tenons cross the battens' grain, so that the battens hold the
    seat's boards. A round stretcher under each batten, its axis
    `stretcher_height` above the floor, joins the front and the back leg.
    """
    floor = orient(at=(0, 0, height - stock.thickness), top_face=UP, back_edge=BACK)
    asm = Assembly("stepstool", root_location=floor)
    seat, battens = _stepstool_seat(
        asm, length, depth, 2, batten_width, batten_inset, slope=4, stock=stock
    )
    batten = battens[0].thickness
    x = batten_inset + batten_width / 2
    legs = _wedged_legs(
        asm,
        seat,
        height - stock.thickness - batten,
        (x, leg_inset),
        tenon,
        kerf=2,
        flare=1.5,
        wedge_length=15,
        gap=batten,
    )
    # The front left and the back left leg go through the left batten.
    for leg, batten_part in zip(
        legs, [battens[0], battens[1], battens[1], battens[0]], strict=True
    ):
        asm.join(Bore(batten_part, leg.right_end, diameter=tenon))
    spans = [("stretcher_right", 1, stretcher_height), ("stretcher_left", 3, stretcher_height)]
    _rod_stretchers(asm, legs, spans, (length - 2 * x, depth - 2 * leg_inset), tenon=16)
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.