Skip to content

Chair

projects.chair

A simple chair, all square; outside sizes of the frame.

The back legs run up into the back. Under the seat, rails rail_width wide are tenoned into the legs as in a table frame, flush with the tops of the front legs. The seat, a panel glued up from seat_boards boards edge to edge, its grain from side to side, lies on them, its top seat_height above the floor; it overhangs the frame by overhang at the front and the sides and the back board is notched at the corners around the back legs, flush with their outsides. The arrises around the seat, top and bottom, are chamfered. Stretchers near the floor and two rails in the back (their top edges at stretcher_heights, for the front and back and for the sides, and at back_rails) have through tenons standing protrusion proud of the legs, their ends chamfered. The side stretchers are lower than the front and back ones, so that the tenons don't meet inside the legs. Between the back rails stand splats, as thick as the rails, with blind tenons in their edges. The tops of the back legs are chamfered all round; the legs taper on their inner sides from leg_taper_length above the floor, below the stretchers, to leg_taper thinner at the floor.

Chair, assembled

Chair, exploded

Parameters

Parameter Default
width 440
depth 420
seat_height 450
height 900
rail_width 80
stretcher_width 30
stretcher_heights (230, 180)
back_rails (620, 870)
back_rail_width 60
setback 3
protrusion 2
tenon_chamfer 2
top_chamfer 4
overhang 10
seat_boards 2
seat_chamfer 3
splats 3
splat_width 30
splat_tenon_length 20
leg_taper 5
leg_taper_length 140
leg_stock 40 mm board, oak
stock 20 mm board, oak
seat_stock 20 mm board, oak

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

from woodwright.examples import projects

design = projects.chair(width=550)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Back rail

back rail

Leg back

leg back

Leg front

leg front

Seat 1

seat 1

Seat 2

seat 2

Seat rail front back

seat rail front back

Seat rail right left

seat rail right left

Splat

splat

Stretcher front back

stretcher front back

Stretcher right left

stretcher right left

Cut list

leg_front             430 x 40 x 40 mm  oak, 2 pieces: leg_front_left; mirror image: leg_front_right
                      - taper 5 mm over 140 on top_face towards left_end
                      - taper 5 mm over 140 on back_edge towards left_end
                      - mortise 60 x 8 mm, 33 deep, in back_edge
                      - mortise 60 x 8 mm, 33 deep, in top_face
                      - through mortise 20 x 8 mm in back_edge
                      - through mortise 20 x 8 mm in top_face
leg_back              900 x 40 x 40 mm  oak, 2 pieces: leg_back_right; mirror image: leg_back_left
                      - chamfer 4 mm on right_end_top_face_arris
                      - chamfer 4 mm on right_end_bottom_face_arris
                      - chamfer 4 mm on right_end_front_edge_arris
                      - chamfer 4 mm on right_end_back_edge_arris
                      - taper 5 mm over 140 on top_face towards left_end
                      - taper 5 mm over 140 on back_edge towards left_end
                      - mortise 60 x 8 mm, 33 deep, in top_face
                      - mortise 60 x 8 mm, 33 deep, in back_edge
                      - through mortise 20 x 8 mm in top_face
                      - through mortise 20 x 8 mm in back_edge
                      - 2 x through mortise 50 x 8 mm in back_edge
seat_rail_front_back  422 x 80 x 20 mm  oak, 2 pieces: seat_rail_front, seat_rail_back
                      - tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on left_end
                      - tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on right_end
seat_rail_right_left  402 x 80 x 20 mm  oak, 2 pieces: seat_rail_right, seat_rail_left
                      - tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on left_end
                      - tenon 60 x 8 mm, 31 long, end mitred 45 deg towards bottom_face, on right_end
stretcher_front_back  444 x 30 x 20 mm  oak, 2 pieces: stretcher_front, stretcher_back
                      - tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on left_end
                      - tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on right_end
stretcher_right_left  424 x 30 x 20 mm  oak, 2 pieces: stretcher_right, stretcher_left
                      - tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on left_end
                      - tenon 20 x 8 mm, 42 long, end chamfered 2 mm, on right_end
back_rail             444 x 60 x 20 mm  oak, 2 pieces: back_rail_lower, back_rail_upper
                      - tenon 50 x 8 mm, 42 long, end chamfered 2 mm, on left_end
                      - tenon 50 x 8 mm, 42 long, end chamfered 2 mm, on right_end
                      - 3 x mortise 20 x 8 mm, 22 deep, in back_edge
splat                 230 x 30 x 20 mm  oak, 3 pieces: splat_1, splat_2, splat_3
                      - tenon 20 x 8 mm, 20 long, on left_end
                      - tenon 20 x 8 mm, 20 long, on right_end
seat_1                460 x 215 x 20 mm  oak
                      - chamfer 3 mm on top_face_left_end_arris
                      - chamfer 3 mm on bottom_face_left_end_arris
                      - chamfer 3 mm on top_face_right_end_arris
                      - chamfer 3 mm on bottom_face_right_end_arris
                      - chamfer 3 mm on top_face_front_edge_arris
                      - chamfer 3 mm on bottom_face_front_edge_arris
seat_2                460 x 215 x 20 mm  oak
                      - notch 50 mm, 40 deep, in back_edge at left_end
                      - notch 50 mm, 40 deep, in back_edge at right_end
                      - chamfer 3 mm on top_face_left_end_arris
                      - chamfer 3 mm on bottom_face_left_end_arris
                      - chamfer 3 mm on top_face_right_end_arris
                      - chamfer 3 mm on bottom_face_right_end_arris
                      - chamfer 3 mm on top_face_back_edge_arris
                      - chamfer 3 mm on bottom_face_back_edge_arris

Code

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

def chair(
    width: float = 440,
    depth: float = 420,
    seat_height: float = 450,
    height: float = 900,
    rail_width: float = 80,
    stretcher_width: float = 30,
    stretcher_heights: tuple[float, float] = (230, 180),
    back_rails: tuple[float, float] = (620, 870),
    back_rail_width: float = 60,
    setback: float = 3,
    protrusion: float = 2,
    tenon_chamfer: float = 2,
    top_chamfer: float = 4,
    overhang: float = 10,
    seat_boards: int = 2,
    seat_chamfer: float = 3,
    splats: int = 3,
    splat_width: float = 30,
    splat_tenon_length: float = 20,
    leg_taper: float = 5,
    leg_taper_length: float = 140,
    leg_stock: Stock = CHAIR_LEG_STOCK,
    stock: Stock = OAK,
    seat_stock: Stock = OAK,
) -> Assembly:
    """A simple chair, all square; outside sizes of the frame.

    The back legs run up into the back. Under the seat, rails `rail_width`
    wide are tenoned into the legs as in a table frame, flush with the tops
    of the front legs. The seat, a panel glued up from `seat_boards` boards
    edge to edge, its grain from side to side, lies on them, its top
    `seat_height` above the floor; it overhangs the frame by `overhang` at
    the front and the sides and the back board is notched at the corners
    around the back legs, flush with their outsides. The arrises around
    the seat, top and bottom, are chamfered. Stretchers near the floor and
    two rails in the back (their top edges at `stretcher_heights`, for the
    front and back and for the sides, and at `back_rails`) have through
    tenons standing `protrusion` proud of the legs, their ends chamfered.
    The side stretchers are lower than the front and back ones, so that the
    tenons don't meet inside the legs. Between the back rails stand
    `splats`, as thick as the rails, with blind tenons in their edges. The
    tops of the back legs are chamfered all round; the legs taper on their
    inner sides from `leg_taper_length` above the floor, below the
    stretchers, to `leg_taper` thinner at the floor.
    """
    asm = Assembly("chair", root_location=STANDING)
    seat = seat_height - seat_stock.thickness
    legs, rails = _table_frame(
        asm,
        width,
        depth,
        seat,
        rail_width,
        setback,
        leg_stock,
        stock,
        leg_lengths=(seat, seat, height, height),
        apron_name="seat_rail",
    )
    back_rail_spans = [
        (f"back_rail_{name}", 2, level, back_rail_width)
        for name, level in zip(["lower", "upper"], back_rails, strict=True)
    ]
    members = _leg_rails(
        asm,
        legs,
        width,
        depth,
        _stretchers(stretcher_heights, stretcher_width) + back_rail_spans,
        stock,
        tenon_length=leg_stock.thickness + protrusion,
        tenon_chamfer=tenon_chamfer,
    )
    for leg in legs[2:]:
        for side in (leg.top_face, leg.bottom_face, leg.front_edge, leg.back_edge):
            leg.cut(Chamfer(leg.arris(leg.right_end, side), size=top_chamfer))
    # The outer sides of the legs are their bottom faces and front edges.
    for leg in legs:
        for side in (leg.top_face, leg.back_edge):
            leg.cut(Taper(side, end=leg.left_end, amount=leg_taper, length=leg_taper_length))

    # The splats stand evenly spaced between the back rails, whose back edges are up.
    lower, upper = members["back_rail_lower"], members["back_rail_upper"]
    splat_length = back_rails[1] - back_rail_width - back_rails[0]
    gap = (lower.length - splats * splat_width) / (splats + 1)
    for j in range(splats):
        splat = asm.add(Board(f"splat_{j + 1}", stock, length=splat_length, width=splat_width))
        distance = gap + j * (gap + splat_width)
        for end, mortise in [
            (splat.left_end, lower.back_edge),
            (splat.right_end, upper.front_edge),
        ]:
            rail = mortise.part
            asm.join(
                MortiseTenon(
                    tenon=end,
                    mortise=mortise,
                    position=offset(distance, ref=rail.left_end),
                    flush=(rail.ref_face, splat.ref_face),
                    tenon_length=splat_tenon_length,
                )
            )

    boards = _glued_top(
        asm,
        rails[0],
        "seat",
        width,
        depth,
        overhang,
        0,
        seat_boards,
        leg_stock,
        setback,
        seat_stock,
    )
    front, back = boards[0], boards[-1]
    # The notches reach from the back edge (y = back.width) and the ends.
    leg_width = leg_stock.thickness
    notch_x, notch_y = overhang + leg_width, (back.width - leg_width, INF)
    for x in [(-INF, notch_x), (back.length - notch_x, INF)]:
        back.cut(Pocket(back.back_edge, (x, notch_y, (-INF, INF)), kind="notch"))
    for board in boards:
        sides = [board.left_end, board.right_end]
        sides += [
            edge
            for edge, outer in [(board.front_edge, front), (board.back_edge, back)]
            if board is outer
        ]
        for side in sides:
            for face in (board.top_face, board.bottom_face):
                board.cut(Chamfer(board.arris(face, side), size=seat_chamfer))
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.