Skip to content

Bench hook

projects.bench_hook

A bench hook: a base with a fence on top at the back and a hook below at the front, glued face to face across the grain.

The base's grain runs away from the woodworker. The fence stops short of the right side, so the saw cuts into the base, not the fence; the hook spans the whole width.

Bench hook, assembled

Bench hook, exploded

Parameters

Parameter Default
length 250
width 180
fence_length 150
fence_width 40
stock 20 mm board, oak
fence_stock 30 mm board, oak

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

from woodwright.examples import projects

design = projects.bench_hook(length=312.5)

Drawings

The plans in one PDF: plans.pdf.

Assembly

assembly

Parts

parts

Base

base

Fence

fence

Hook

hook

Cut list

base   250 x 180 x 20 mm  oak
fence  150 x 40 x 30 mm  oak
hook   180 x 40 x 30 mm  oak

Code

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

def bench_hook(
    length: float = 250,
    width: float = 180,
    fence_length: float = 150,
    fence_width: float = 40,
    stock: Stock = OAK,
    fence_stock: Stock = THICK_OAK,
) -> Assembly:
    """A bench hook: a base with a fence on top at the back and a hook below
    at the front, glued face to face across the grain.

    The base's grain runs away from the woodworker. The fence stops short of
    the right side, so the saw cuts into the base, not the fence; the hook
    spans the whole width.
    """
    # The base lies flat, its length away from the viewer: its back edge is
    # to the left.
    asm = Assembly("bench_hook", root_location=orient(right_end=BACK, ref_face=UP))
    base = asm.add(Board("base", stock, length=length, width=width))
    fence = asm.add(Board("fence", fence_stock, length=fence_length, width=fence_width))
    hook = asm.add(Board("hook", fence_stock, length=width, width=fence_width))
    asm.join(
        Butt(
            base.top_face,
            fence.bottom_face,
            flush=(base.right_end, fence.back_edge),
            position=flush_with(base.back_edge),
        )
    )
    asm.join(Butt(base.bottom_face, hook.top_face, flush=(base.left_end, hook.front_edge)))
    return asm

Exported with woodwright 0.9.0 on 2026-10-25.