New Project

Fastener Joints#

Dowel, pocket-hole, biscuit, domino, and edge-glue joinery

Names: dowel pocket_hole biscuit domino edge_glue screw_type spacing count biscuit_spacing biscuit_size

When to use#

Joining boards with loose fasteners laid out in a row: dowels, pocket screws, biscuits, dominos, and glued edge seams (a tabletop of several boards, a carcass corner). They are the cheap, jig-made joints. For a joint a woodworker would cut by hand (tenon, lap, dovetail) see the other joinery-* files. The marks, join and the layout rule are in joinery-contract.

Syntax#

KindParamsNotes
doweldiameter count depthcount is floored to a whole number with a warning; depth is into each part
pocket_holescrew_type spacing, opt. facescrew_type is plain quoted text: "1-1/4_coarse", "2_fine" (length in inches, thread); face is a CEL string "'neg_y'"
biscuitsize spacingsize is 0, 10 or 20 only
dominosize spacing, opt. depthsize is the tenon thickness 4 5 6 8 10; depth per part, default half the tenon length
edge_glueopt. biscuit_spacing biscuit_sizeBiscuits only when biscuit_spacing is given; otherwise a plain glued seam

All of them take clearance (female side only). Fasteners run in a row along the long axis of the faces' overlap, centred on the male mark, each in an equal share of the longest span centred on the mark that stays on the overlap.

  • dowel: count of them. Make the count follow a board with an expression: count "floor(1.0 + (shelf_depth / dowel_spacing))". A hole must stop at least 3 mm short of the far face (the remaining-wall rule): depth "carcass_th - 4.0" on a carcass side.
  • pocket_hole, biscuit, domino, edge_glue: one fastener per whole spacing of that span, at least one, so the count follows the board as a slider moves.
  • pocket_hole cuts a 15 degree pocket and pilot in the male, drilled into one of the two faces across the joint: face names it (a male part-local face), else the one no other part covers, else the underside of a board lying flat and the + face of one standing. The female gets the matching pilot. The pockets are bench work (a jig) and the fabrication pack says so.
  • edge_glue joins board edges for a panel; the marks sit on the facing edges.

Example#

joinery dowel name=J {
    diameter 8.0
    count 2.0
    depth 15.0
    clearance glue_clearance
}
joinery biscuit name=J {
    size 20.0
    spacing 100.0
    clearance glue_clearance
}

A pocket hole needs a board with room behind the joint face for the 15 degree run (a thin rail is refused: "a pocket ... reaches N mm back from the joint face"). This block is linted only; the geometry that builds is examples/filing_cabinet_lateral.kdl's PlinthFastener.

joinery pocket_hole name=J {
    screw_type "1-1/4_coarse"
    spacing 100.0
}

Pitfalls and diagnostics#

  • A fractional count warns and floors (ADR-0005): write a whole number.
  • A biscuit size other than 0/10/20, or a domino size outside 4 5 6 8 10, is out of range and refused.
  • A fastener wider than the overlap, closer than its own size to its neighbour, or deeper than the board is refused; less than max(3 mm, 15 %) left behind a blind hole warns.
  • screw_type is plain text, not an expression: do not wrap it in inner single quotes. face is a CEL string and does need them: face "'neg_y'".
  • End-grain pocket screws into hardwood is a poor choice the validator cannot see.
  • The count of an edge_glue biscuit row follows biscuit_spacing; none given means no biscuits, not a default.

See also#

  • docs/KDL_AUTHORING.md §8 ("What the compiler cuts, and what it checks"); ADR-0013 (joint framework).
  • examples/bookcase.kdl (biscuit, dowel, domino), examples/dining_table.kdl (edge_glue with biscuits), examples/filing_cabinet_lateral.kdl (dowel, pocket hole), examples/blanket_chest.kdl.
  • joinery-contract.md, joinery-laps-and-boxes.md.

Names#

Every name this page declares, how the example library uses it, and the shortest real use.

dowel#

joinery kind; value in 32 of 116 examples (54 uses).

Shortest real use, from tall_white_cutout_cabinet.kdl:

joinery dowel name=TopDowel {
    diameter 8.0
    count 3
    depth 18.0
    clearance glue_clearance
}

pocket_hole#

joinery kind; value in 5 of 116 examples (7 uses).

Shortest real use, from pennsylvania_schrank.kdl:

joinery pocket_hole name=PlinthFix {
    screw_type "2_coarse"
    spacing 100.0
}

biscuit#

joinery kind; value in 1 of 116 examples (2 uses).

Shortest real use, from bookcase.kdl:

joinery biscuit name=TopEdgeGlue {
    size biscuit_size
    spacing biscuit_spacing
    clearance glue_clearance
}

domino#

joinery kind; value in 1 of 116 examples (1 uses).

Shortest real use, from bookcase.kdl:

joinery domino name=FrameCorner {
    size domino_size
    spacing domino_spacing
    depth domino_depth
    clearance glue_clearance
}

edge_glue#

joinery kind; value in 8 of 116 examples (8 uses).

Shortest real use, from shaker_trestle_dining_table.kdl:

joinery edge_glue name=PineSeam { }

screw_type#

word-valued property; node in 5 of 116 examples (7 uses).

Shortest real use, from blanket_chest.kdl:

screw_type "2_coarse"

spacing#

property; node in 6 of 116 examples (10 uses); property in 1 of 116 examples (1 uses).

Shortest real use, from desk.kdl:

spacing 32.0

count#

property; node in 32 of 116 examples (54 uses); property in 70 of 116 examples (192 uses).

Shortest real use, from tall_white_cutout_cabinet.kdl:

count 3

biscuit_spacing#

node in 5 of 116 examples (5 uses); value in 1 of 116 examples (2 uses).

Shortest real use, from arts_crafts_hayrake_table.kdl:

biscuit_spacing 200.0

biscuit_size#

node in 1 of 116 examples (1 uses); value in 1 of 116 examples (2 uses).

Shortest real use, from bookcase.kdl:

biscuit_size 10.0 min=10.0 max=20.0 step=10.0 label="Biscuit Size" category="Joinery"

Settings

Region

A region picks sensible defaults; change any of these separately.

Units

In inches, type lengths the way you say them: 34 1/2, 3/4", 1'-2" or 12.7mm. A length that can't be read is flagged, never rounded to something else.

Paper
Date order
Clock