Skip to content

Butt frame and panel

frames.butt_frame_and_panel

A frame butt-joined at the corners, a panel tongued on all four edges into grooves along its inside edges.

The panel's design size is the opening of the frame, the tongues add to it; it is centered in the frame's thickness. The grooves in the rails run through, into those in the stiles, which are stopped where the rails' grooves meet them, so that they don't show at the stiles' ends. The glued corners hold little (end grain on long grain): a frame for a light panel, or one to be screwed or dowelled (not modelled).

Butt frame and panel, assembled

Butt frame and panel, exploded

Parameters

Parameter Default
stile_length 500
rail_length 300
width 60
tongue_length 10
stock 20 mm board, oak
panel_stock 10 mm board, oak

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

from woodwright.examples import frames

design = frames.butt_frame_and_panel(stile_length=625)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Panel

panel

Rail

rail

Stile

stile

Cut list

stile  500 x 60 x 20 mm  oak, 2 pieces: stile_left, stile_right
       - stopped groove 6 mm, 10 deep, in back_edge, 50 mm short of left_end and 50 mm short of right_end
rail   300 x 60 x 20 mm  oak, 2 pieces: rail_top, rail_bottom
       - groove 6 mm, 10 deep, in back_edge
panel  400 x 320 x 10 mm  oak
       - tongue 6 mm thick, 10 long, on front_edge
       - tongue 6 mm thick, 10 long, on back_edge
       - tongue 6 mm thick, 10 long, on right_end
       - tongue 6 mm thick, 10 long, on left_end

Code

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

def butt_frame_and_panel(
    stile_length: float = 500,
    rail_length: float = 300,
    width: float = 60,
    tongue_length: float = 10,
    stock: Stock = OAK,
    panel_stock: Stock = THIN_OAK,
) -> Assembly:
    """A frame butt-joined at the corners, a panel tongued on all four edges
    into grooves along its inside edges.

    The panel's design size is the opening of the frame, the tongues add to
    it; it is centered in the frame's thickness. The grooves in the rails
    run through, into those in the stiles, which are stopped where the
    rails' grooves meet them, so that they don't show at the stiles' ends.
    The glued corners hold little (end grain on long grain): a frame for a
    light panel, or one to be screwed or dowelled (not modelled).
    """

    def corner(rail_end: SideRef, stile_edge: SideRef, position: Position, outer: SideRef) -> Joint:
        return Butt(stile_edge, rail_end, position=position)

    asm, (stile_left, stile_right, rail_top, rail_bottom) = _frame(
        "butt_frame_and_panel", corner, stile_length, rail_length, width, stock
    )
    panel = asm.add(Board("panel", panel_stock, length=stile_length - 2 * width, width=rail_length))
    stop = width - tongue_length  # where the rails' grooves end
    for groove, edge, stopped in [
        (
            stile_left.back_edge,
            panel.front_edge,
            {stile_left.left_end: stop, stile_left.right_end: stop},
        ),
        (
            stile_right.front_edge,
            panel.back_edge,
            {stile_right.left_end: stop, stile_right.right_end: stop},
        ),
        (rail_top.back_edge, panel.right_end, None),
        (rail_bottom.front_edge, panel.left_end, None),
    ]:
        asm.join(
            TongueAndGroove(
                tongue=edge,
                groove=groove,
                tongue_length=tongue_length,
                across=CENTERED,
                stopped=stopped,
            )
        )
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.