---
title: "Bed bolts"
description: "The knock-down rail-to-post joint — four sizes, and the five holes across two parts that each declaration cuts."
url: https://kaicad.barpom.xyz/docs/catalogue/bed-bolts
schema: "0.1"
source: packages/catalogue/data/fixtures/bed-bolt.yaml
---

# Bed bolts

A bed bolt passes through the post from the outside and threads into a **steel cross dowel**
buried in the end of the rail. It is the joint that lets a bed come apart to get up a
staircase, and it is the clearest illustration of why a fixture in this catalogue is a
machining recipe rather than a mesh.

One declaration cuts **five holes across two parts**, one of them perpendicular to the other
four and at a specific depth. Getting the cross-dowel bore wrong is the classic way a
knock-down bed fails.

```yaml
- id: rail_to_head_post_left
  kind: bed_bolt
  fixture: fixtures.bed_bolt.m8x150
  removable: true
  through: head_post@left
  mate:
    a: side_rail@left:face.start
    b: head_post@left:face.top
    align: { contact: true, roll: -90, offset: [rail_drop_on_head_post, 0, 0] }
  fasteners:
    pattern: { along: length, count: 2, spacing: 100, from: ..., to: ... }
```

## The four sizes

| Id | d | Length | Drive | Dowel | Washer |
| --- | --- | --- | --- | --- | --- |
| `fixtures.bed_bolt.m6x80` | 6 | 80 | Hex 4 | 10 × 25, M6 | 12 |
| `fixtures.bed_bolt.m8x100` | 8 | 100 | Hex 5 | 12 × 30, M8 | 16 |
| `fixtures.bed_bolt.m8x130` | 8 | 130 | Hex 5 | 12 × 30, M8 | 16 |
| `fixtures.bed_bolt.m8x150` | 8 | 150 | Hex 5 | 12 × 30, M8 | 16 |

## What each one cuts

All four use `through_from: opposite` — **the bolt is driven through the post from the
outside**, so its head and counterbore are on the face *away* from the rail. This is the field
that catches people; see
[`through`](/docs/schema/joints#through--which-way-the-hardware-goes-in).

### In the post (the through part)

| Id | Clearance | Counterbore |
| --- | --- | --- |
| `m6x80` | 7 mm, through | 14 × 7 |
| `m8x100` | 9 mm, through | 18 × 8 |
| `m8x130` | 9 mm, through | 18 × 8 |
| `m8x150` | 9 mm, through | 18 × 8 |

### In the rail (the receiving part)

| Id | Bolt bore | Cross bore | At depth |
| --- | --- | --- | --- |
| `m6x80` | 7 mm × 50 deep | 10.5 mm, through the width | 35 |
| `m8x100` | 9 mm × 60 deep | 12.5 mm, through the width | 40 |
| `m8x130` | 9 mm × 85 deep | 12.5 mm, through the width | 65 |
| `m8x150` | 9 mm × 100 deep | 12.5 mm, through the width | 80 |

The bolt bore runs in from the mating face — the end of the rail. The cross bore is drilled
perpendicular to it, at `at_depth` from that same face, and **must intersect the bolt bore**
for the dowel to capture the bolt.

Those two numbers have to agree with each other and with the bolt's length, which is precisely
why nobody should be typing them.

## The rules

| Id | Min edge | Min end | Min engagement | Min spacing |
| --- | --- | --- | --- | --- |
| `m6x80` | 20 | 30 | 40 | 60 |
| `m8x100` | 18 | 38 | 50 | 70 |
| `m8x130` | 18 | 38 | 70 | 70 |
| `m8x150` | 18 | 38 | 70 | 70 |

All require a **square shoulder** — the rail end has to meet the post flat, because the joint
is a clamp and a gappy shoulder makes it a hinge.

**The edge distance is governed by the cross dowel, not the bolt.** A 12.5 mm bore wants about
1.4 diameters of wood on each side, so an M8 bed bolt needs a rail of roughly 35 mm or more.
An M8 through a 25 mm rail leaves 3.5 mm of timber around an 18 mm counterbore, and the
validator says so:

```
FAS-001  M8 bed bolts through a 25 mm rail leave 3.5 mm of wood around the
         counterbore. Use `fixtures.bed_bolt.m6x80`, or increase the rail
         thickness to 38 mm.
```

## End grain is fine here

All four carry `forbid_into_end_grain: allow`, which is the opposite of every other fixture in
the catalogue.

The bolt threads into a **steel cross dowel**, not into the wood. That is the entire reason
this joint exists: the end of a rail is the worst place in a piece of furniture to put a
screw, and a bed bolt does not put one there.

## Choosing a size

The bolt has to pass through the post and still reach a dowel far enough into the rail:

> **post thickness − counterbore depth + cross-dowel depth ≤ bolt length**

The counterbore buries the head, so it does not count against the length. A 75 mm post with
the M8 × 150 works out at 75 − 8 + 80 = **147**, inside the bolt's 150 — which is why that
entry notes it suits a 75 mm post. A thinner post takes a shorter bolt.

Two bolts per corner, 100 mm apart, is the normal arrangement. One bolt is a pivot.

## Assembly

Hex key, removable, and the step hint is `final_assembly` — the bolts go in last, after the
ends are stood up and the rails are offered in. The assembly steps generated from
`assembly.disassembly` put them in that order.

## Procurement

| Id | Pack sizes | Unit cost |
| --- | --- | --- |
| `m6x80` | 4 · 8 | 1.80 |
| `m8x100` | 4 · 8 | 2.40 |
| `m8x130` | 4 · 8 | 2.90 |
| `m8x150` | 4 · 8 | 3.40 |

A bed with two bolts at each of four corners needs eight, which is one pack.
