---
title: "BOMs"
description: "Bills of materials — which parts go into which assembly, and how many."
---

import { Image } from 'astro:assets';
import branchFlow from '../../../../assets/diagrams/branch-pr-flow.svg';

A **BOM** (bill of materials) is a list of part lines that together describe an assembly. Each line says "use *N* of part *X*, mounted at *Y*". A PCB BOM has hundreds of lines; a top-level product BOM may have only a dozen, each pointing at a sub-assembly.

## Single-level by design

BOMs in simple-plm are **single-level**: each BOM lists only direct children, never grandchildren. Multi-level assemblies are achieved by composition — a top-level BOM lists a sub-assembly part, and that sub-assembly has its own BOM. This keeps each YAML file readable and each change atomic.

## Line fields

| Field | Purpose |
|-------|---------|
| `part` | The child part number. |
| `qty` | How many. Integers for discrete parts, decimals allowed for raw material. |
| `unit` | Optional unit override (default is "each"). |
| `reference_designators` | List of board references — `["R1", "R2", "R3"]`. |
| `alternates` | List of equivalent parts the buyer may substitute. |

## How edits land

A BOM edit in the dashboard becomes a commit on a branch — usually the working branch tied to an active ECO. Once the ECO is approved, that branch merges into `main`.

<Image src={branchFlow} alt="An ECO branches off main, accumulates BOM edits as commits, then merges back when approved." />

## On disk

```yaml
# plm-data/boms/ASSY-PCB-001.yaml
parent: ASSY-PCB-001
lines:
  - part: R-10K-0603
    qty: 4
    reference_designators: [R1, R2, R3, R4]
  - part: C-100N-0402
    qty: 12
    alternates: [C-100N-0603]
```

See [`plm boms`](/docs/cli/boms/) for the CLI surface.
