---
title: "Parts"
description: "Part numbers, revisions, attributes, and attachments."
---

A **part** is the atomic unit in simple-plm — anything you buy, fabricate, or assemble that you want to track by a unique identifier. It can be a 10-kΩ resistor, a CNC'd bracket, a sub-assembly, or a finished product. Everything else (BOMs, ECOs, releases) refers back to parts.

## Part numbers

Part numbers (PNs) are the primary key. They must match this shape:

```
^[A-Z0-9][A-Z0-9-]{2,49}$
```

In plain English: start with an uppercase letter or digit, then 2–49 more uppercase letters, digits, or hyphens. So `R-10K-0603`, `PCB-001`, and `ASSY-FINAL-V2` are all legal; `pn-1` (lowercase) and `R` (too short) are not.

## Revisions

Every part has a free-form `revision` string. Semantic conventions like `A`, `B`, `A.1` work, as do date-based or commit-hash schemes. simple-plm doesn't enforce a particular system — pick one with your team and stick to it.

## Attributes and attachments

Beyond PN and revision, a part has:

- **`description`** — short human label.
- **`attributes`** — free-form key/value map for things like value, tolerance, package, finish, weight.
- **`attachments`** — files in `plm-data/parts/<pn>/attachments/` (datasheets, 3-D models, drawings).

## On disk

```yaml
# plm-data/parts/R-10K-0603/part.yaml
pn: R-10K-0603
revision: A
description: 10 kΩ resistor, 0603, 1%
attributes:
  value: 10k
  tolerance: 1%
  package: '0603'
```

:::tip
Looking for the CLI commands? See [`plm parts`](/docs/cli/parts/).
:::
