Skip to content

Ledged door

projects.ledged_door

A ledged cupboard door: tongue-and-groove boards on two ledges across the back.

The boards stand side by side, each tongued into a groove along the next, not glued, so they can move; the outer boards' outer edges are plain. On the front the arrises along the joints are chamfered, so that each joint shows as a V and a gap opening as the boards shrink is hidden. The ledges, ledge_from_ends from the top and the bottom and ledge_inset in from the sides, are screwed to each board from the back, one screw in the middle of each board, so that the boards can still move; no braces.

Ledged door, assembled

Ledged door, exploded

Parameters

Parameter Default
height 600
width 400
boards 4
ledge_width 80
ledge_from_ends 80
ledge_inset 15
chamfer 3
stock 20 mm board, oak

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

from woodwright.examples import projects

design = projects.ledged_door(height=750)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Board

board

Board 1

board 1

Board 4

board 4

Ledge

ledge

Cut list

board_1  600 x 100 x 20 mm  oak
         - chamfer 3 mm on bottom_face_back_edge_arris
         - groove 8 mm, 10 deep, in back_edge
         - 2 x pilot hole ø3, 10 deep, drill point 118 deg, in top_face, 120 and 480 from left_end; centered, for a 4 x 30 screw
board    600 x 110 x 20 mm  oak, 2 pieces: board_2, board_3
         - chamfer 3 mm on bottom_face_front_edge_arris
         - chamfer 3 mm on bottom_face_back_edge_arris
         - tongue 8 mm thick, 10 long, on front_edge
         - groove 8 mm, 10 deep, in back_edge
         - 2 x pilot hole ø3, 10 deep, drill point 118 deg, in top_face, 120 and 480 from left_end; centered, for a 4 x 30 screw
board_4  600 x 110 x 20 mm  oak
         - chamfer 3 mm on bottom_face_front_edge_arris
         - tongue 8 mm thick, 10 long, on front_edge
         - 2 x pilot hole ø3, 10 deep, drill point 118 deg, in top_face, 120 and 480 from left_end; centered, for a 4 x 30 screw
ledge    370 x 80 x 20 mm  oak, 2 pieces: ledge_top, ledge_bottom
         - 4 x clearance hole ø4.5, countersunk ø8, 90 deg, in top_face, 35 to 335 every 100 from left_end; centered, for a 4 x 30 screw

Code

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

def ledged_door(
    height: float = 600,
    width: float = 400,
    boards: int = 4,
    ledge_width: float = 80,
    ledge_from_ends: float = 80,
    ledge_inset: float = 15,
    chamfer: float = 3,
    stock: Stock = OAK,
) -> Assembly:
    """A ledged cupboard door: tongue-and-groove boards on two ledges across the back.

    The boards stand side by side, each tongued into a groove along the
    next, not glued, so they can move; the outer boards' outer edges are
    plain. On the front the arrises along the joints are chamfered, so
    that each joint shows as a V and a gap opening as the boards shrink
    is hidden. The ledges, `ledge_from_ends` from the top and the bottom
    and `ledge_inset` in from the sides, are screwed to each board from
    the back, one screw in the middle of each board, so that the boards can
    still move; no braces.
    """
    # The boards' reference faces are at the back, their back edges to the right.
    asm = Assembly("ledged_door", root_location=STANDING)
    door = [
        asm.add(Board(f"board_{i + 1}", stock, length=height, width=width / boards))
        for i in range(boards)
    ]
    for a, b in itertools.pairwise(door):
        asm.join(TongueAndGroove(tongue=b.front_edge, groove=a.back_edge))
        for edge in (a.back_edge, b.front_edge):
            edge.part.cut(Chamfer(edge.part.arris(edge.part.bottom_face, edge), size=chamfer))
    first = door[0]
    for name, end in [("top", first.right_end), ("bottom", first.left_end)]:
        ledge = asm.add(
            Board(f"ledge_{name}", stock, length=width - 2 * ledge_inset, width=ledge_width)
        )
        asm.join(
            Butt(
                first.top_face,
                ledge.bottom_face,
                position=offset(ledge_from_ends, ref=end),
                flush=(first.front_edge, ledge.left_end),
                across=offset(ledge_inset),
            )
        )
        for i, board in enumerate(door):
            at = {ledge.left_end: (i + 0.5) * board.width - ledge_inset}
            asm.join(Screw(ledge.top_face, into=board, length=30, at=at))
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.