Skip to the content
PCBKitNew board
4 layers42 × 100 mmLockBox, the printed circuit board in 3D

RAD unified assembly docs — ohai.researchanddesire.com

Size
42 × 100 mm
Copper layers
4
Thickness
1.6 mm
Parts
81
Nets
68
Pads
304
Tracks, vias
714, 133
Pours
8
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
12 Jun 2026
Updated
21 Oct 2026

Overview

LockBox is an open-source printed circuit board by researchanddesire, from the researchanddesire/assembly-docs repository on GitHub. It is a 4-layer board of 42 × 100 mm with 81 parts on 68 nets, routed with 714 tracks and 133 vias.

It is built around the ESP32-S3-WROOM-1-N16R8, DRV8210DSG and INA219AIDCN, with the TMR2101SO, ME6211C33M5G-N and TCS40DPR,LF among its other parts. Its parts include 23 capacitors, 21 resistors, 12 ICs, 7 switches and 4 diodes. It belongs with the ESP32 boards of this library.

Main components

12

README

README.md

assembly-docs

This repository is the public, editable content mirror for R+D Assembly. Rendered page titles and section headings link to their exact source lines under content/docs/.

Contributions target main. Documentation syncs run main to main: when a change to content/ merges into main, the notifier wakes rad-app (the hub), which imports it into rad-app main and merges the import automatically. The live site deploys from there. staging is never synced; for documentation, main always wins.

This repository's content/ tree mirrors rad-app/apps/docs-ohai/content/, including every language and asset. English product pages use .en.mdx; navigation uses meta.en.json. The four hardware repositories (researchanddesire/OSSM, Open-Source-Chastity-Lockbox_LKBX, Open-Source-Deepthroat-Trainer_DTT and Open-Source-Wireless-Remote_RADR) supply their English product pages from their own assembly-docs/ folders on main. When a page exists in both places, the most recently changed copy wins, and the OSSM BOM always comes from that repository's hardware/bom.csv. The hub never writes back to this repository or to the hardware repositories.

Every change to main, including deletions, reaches the live site within minutes without further review.

The notifier needs the organization's RAD_VERSION_CONTROL_APP_ID variable and RAD_VERSION_CONTROL_PRIVATE_KEY secret with access to rad-app.

Historical MkDocs tooling (not the active synchronization pipeline)

The remaining sections document legacy tooling retained for reference. Do not use it to regenerate the active content/ tree or dispatch directly to hardware.

Aggregates each hardware product's assembly-docs/ folder into a single MkDocs Material site, following the same architecture as dev-docs.

How it works

  • Each Ohai product repo opts in with the GitHub topic ohai-assembly-docs and keeps its assembly package in assembly-docs/ at the repo root: markdown pages, an assets/ folder of images, site.yml metadata, and a nav.yml (site_name + nav) describing page order.
  • scripts/assemble-docs.sh discovers eligible product repos, shallow-clones them, stages each assembly-docs/ package, and replaces docs/{product}/ only after that product assembles successfully.
  • .github/workflows/deploy.yml assembles, builds, and deploys to GitHub Pages on:
    • pushes to main touching docs/**, mkdocs.yml, or scripts/**
    • repository_dispatch events of type assembly-docs-rebuild, sent by each product repo's trigger-assembly-docs.yml workflow when its assembly-docs/**, BOM, PCB, or cable-source changes
    • manual workflow_dispatch

Products

Products are discovered from non-archived researchanddesire/* repositories with the ohai-assembly-docs topic and valid assembly-docs/site.yml metadata. Template repos and repos with unreplaced placeholders are skipped.

Products whose repos don't yet have an assembly-docs/ folder are skipped with a warning at assemble time.

Local development

bash
pip install -r requirements.txt

# Assemble from local checkouts (skips cloning):
ASSEMBLE_LOCAL="$HOME/Github" ./scripts/assemble-docs.sh

mkdocs serve

Without ASSEMBLE_LOCAL, the script discovers topic-tagged repos through the GitHub API and clones them: via a per-repo read-only deploy key when ASSEMBLE_SSH_DIR contains one, via ASSEMBLE_GITHUB_TOKEN if set, otherwise over anonymous HTTPS (sufficient once the repos are public at cutover).

Secrets

While product repos are private, CI needs an ASSEMBLE_GITHUB_TOKEN secret with read access to the product repos so discovery can see topic-tagged private repos. Per-repo read-only deploy keys are still supported as a transition path.

Each product repo's trigger-assembly-docs.yml needs a DOCS_DISPATCH_TOKEN secret — a fine-grained PAT (or org secret) with contents: write on this repo, since the default GITHUB_TOKEN cannot send cross-repo dispatches.

Bill of Materials rendering

Each product's hardware/bom.csv is rendered into a polished, colour-coded HTML Bill of Materials and embedded in that product's assembly-docs bom.md page. The rendered BOM belongs to the assembly docs only — never to developer docs. (Developer docs may document this workflow, as here, but must not embed the rendered BOM.)

Where things live

ThingPath
BOM data (source of truth, per product repo)hardware/bom.csv
Rendererscripts/render_bom.py
Category code → label → colour map (single source)scripts/bom_categories.py
Chip / table structure + focus stylesdocs/stylesheets/assembly.css
BOM page (per product repo, carries the markers)assembly-docs/bom.md
Generated block markers<!-- BEGIN GENERATED BOM --> … <!-- END GENERATED BOM -->
PCB page / KiCanvas viewer assemblyscripts/split_pcb_design_assets.py + scripts/insert_kicanvas_pcb.py
Cable harness source filesProduct repo hardware/cables/

The renderer is read-only on hardware/bom.csv and validates its header against the canonical BOM schema (dev-docs); it never changes the schema.

How it runs

Rendering happens at assemble time, so the embedded block is never committed per-product and can never go stale:

  • scripts/assemble-docs.sh clones each product repo and, for each, renders hardware/bom.csv into the assembled docs/{product}/bom.md between the markers. Commit SHA (used for commit-pinned source links) and release status are auto-detected from the product checkout's git.
  • Product assembly packages carry pcb-overview.md and cable-harnesses.md. Legacy ## PCB design assets sections from BOM pages are still moved into the standalone PCB page during assembly for migration safety.
  • If hardware/pcb/ contains KiCad board files (**/*.kicad_pcb), assembly copies those board files into the assembled site, preserving their relative subfolders, and embeds KiCanvas viewer previews. Non-KiCad PCB sources get the standalone page without a KiCanvas render.
  • If a product's bom.md has no markers, or its bom.csv is a header-only template, the page is left untouched.
  • Cable harnesses are product-level BOM assemblies. Detailed child cable BOMs belong to Wireviz-generated artifacts such as .bom.tsv, linked from the assembly cable page.

A self-contained Lockbox BOM demo (demo/lockbox/) validates the workflow end-to-end without depending on a cloned repo or fabricating real product data. Disable it with ASSEMBLE_BOM_DEMO=0.

Run it locally

bash
pip install -r requirements.txt

# Render the demo BOM into the assembled site and preview:
ASSEMBLE_LOCAL="$HOME/Github" ./scripts/assemble-docs.sh
mkdocs serve

# Render a single product's BOM into a page directly (read-only on the CSV):
python3 scripts/render_bom.py \
  --bom path/to/hardware/bom.csv \
  --page path/to/assembly-docs/bom.md \
  --repo-url https://github.com/researchanddesire/Lockbox \
  --require-markers

When CI runs

  • The site rebuilds when a product repo's assembly-docs/**, BOM CSVs, hardware/pcb/**, or hardware/cables/** changes (templates/trigger-assembly-docs.yml → repository_dispatch → deploy.yml), and on pushes to this repo's docs/** / mkdocs.yml / scripts/**.
  • On a tagged product release, templates/generate-bom-release.yml (a caller in the product repo) invokes the reusable .github/workflows/bom-release.yml here, which renders a standalone bom.html and publishes it as a GitHub Actions artifact + Release asset — unless the repo already commits a bom.html.

Troubleshooting

  • Page didn't update: confirm assembly-docs/bom.md has both markers and that hardware/bom.csv has data rows (a header-only template is skipped).
  • BOM header does not match the canonical RAD BOM schema: the CSV header drifted; fix hardware/bom.csv to match the 12-column schema exactly. The renderer will not change the schema.

Cutover

At OSS cutover, add the ohai-assembly-docs topic to the canonical public product repos, remove it from superseded private forks, set site_url in mkdocs.yml to https://ohai.researchanddesire.com/, and configure the custom domain in the Pages settings.

Parts

81
QtyValueFootprintReferences
100.1uCapacitor_SMD:C_0402_1005MetricC1, C4, C5, C6, C7, C16, C17, C18, C19, C23
810kResistor_SMD:R_0402_1005MetricR2, R8, R9, R13, R14, R16, R19, R22
5100uCapacitor_SMD:C_1206_3216MetricC8, C9, C10, C11, C12
51uCapacitor_SMD:C_0402_1005MetricC3, C15, C20, C21, C22
5MountingHoleMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4, H5
42kResistor_SMD:R_0402_1005MetricR1, R6, R7, R15
4SW_PushButton_Switch_THT:SW_PUSH_6mm_H8mmSW2, SW5, SW7, SW8
310Resistor_SMD:R_0603_1608MetricR4, R5, R17
310uCapacitor_SMD:C_0402_1005MetricC2, C13, C14
3B5819WDiode_SMD:D_SOD-123D2, D3, D4
3TMR2101SOPackage_TO_SOT_SMD:SOT-23U8, U9, U10
2100kResistor_SMD:R_0402_1005MetricR12, R20
25.1kResistor_SMD:R_0402_1005MetricR10, R11
2ME6211C33M5Package_TO_SOT_SMD:SOT-23-5U4, U11
2TCS40DPR,LFPackage_TO_SOT_SMD:SOT-23U6, U7
2TestPointTestPoint:TestPoint_Pad_1.0x1.0mmTP1, TP2
10.1Resistor_SMD:R_0603_1608MetricR3
133Resistor_SMD:R_0805_2012MetricR18
1AFC01-S14FCA-00Lockbox:JUSHUO_AFC01-S14FCA-00J4
1AO3400Package_TO_SOT_SMD:SOT-23Q2
1DRV8210DSGRPackage_SON:WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mmU3
1ESP32-S3-WROOM-1Lockbox:ESP32-S3-WROOM-1-FIXEDU1
1INA219AIDCNPackage_TO_SOT_SMD:SOT-23-8U5
1LED_SmallLED_SMD:LED_0603_1608MetricD1
1PEC12R-2120F-N0012Rotary_Encoder:RotaryEncoder_Bourns_Horizontal_PEC12R-2x17F-NxxxxSW6
1Q_PMOS_DGSPackage_TO_SOT_SMD:SOT-23Q3
1S2B-PH-SM4-TB(LF)(SN)Connector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_HorizontalJ2
1ST6519Lockbox:ST_UDFN-6_1.0x1.45mm_P0.5mmU12
1SW_PushLockbox:SW_SPST_TSB008A2518ASW1
1SW_SPDTButton_Switch_THT:SW_CK_JS202011AQN_DPDT_AngledSW3
1Si2301Package_TO_SOT_SMD:SOT-23Q1
1TP4054Package_TO_SOT_SMD:SOT-23-5_HandSolderingU2
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J3
1~Connector_JST:JST_SH_SM02B-SRSS-TB_1x02-1MP_P1.00mm_HorizontalJ1

Questions

How big is the LockBox PCB?

It measures 42 × 100 mm and has 4 copper layers, 1.6 mm thick.

What parts does the LockBox use?

81 parts, built around the ESP32-S3-WROOM-1-N16R8, DRV8210DSG, INA219AIDCN and TMR2101SO. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the LockBox KiCad files?

From the researchanddesire/assembly-docs repository on GitHub, at the commit this page was made from: the board is content/docs/lockbox/assets/kicanvas/LockBox.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the LockBox design in my own project?

Its repository states no licence, so its author keeps all rights: ask researchanddesire before reusing the design.

More from researchanddesire/assembly-docs

1
  • 2 layers44 × 92 mm217A dttrainer rev4, the printed circuit board in 3D

    217A dttrainer rev4

    researchanddesire/assembly-docs

    RAD unified assembly docs — ohai.researchanddesire.com

    79 parts

Similar boards

  • 4 layers97.1 × 26 mmDiveCAN Head2, the printed circuit board in 3D

    DiveCAN Head2

    QuickRecon/DiveCANHead

    An open source rebreather head controller

    157 parts13MIT
  • 4 layers70 × 116 mmPanel, the printed circuit board in 3D

    Panel

    Dennis960/Blumy

    A smart, WiFi-enabled ESP32 soil moisture and plant sensor

    174 parts3
  • 4 layers42 × 65 mmIcarus Flight Computer, the printed circuit board in 3D

    Icarus Flight Computer

    daedalus-ind/icarus-hardware

    Hardware of the onboard flight computer for the Icarus rocket.

    106 parts2MIT
  • 4 layers50 × 20 mmGigaPower200V, the printed circuit board in 3D

    GigaPower200V

    kaminaris/GigaESC-Power200V

    Compact 50 × 20 mm non-isolated power-supply module for the modular GigaESC platform, intended for the 200 V version. Provides 12 V, 5 V and 3.3 V rails through a separate output connector.

    70 parts
  • 4 layers65 × 75 mmRp2040 audioboard, the printed circuit board in 3D

    Rp2040 audioboard

    lzptr/rp2040_audioboard

    Mixed signal audio board using the rp2040

    124 partsMIT
  • 2 layers112 × 202 mmRIAA, the printed circuit board in 3D

    RIAA

    leicht-io/BeoGram-4002-RIAA

    Open-source RIAA phono preamp for the Bang & Olufsen BeoGram 4002/4004 turntable (KiCad)

    63 parts5CERN-OHL-S-2.0
  • 6 layers126.8 × 99.9 mmStima V4 Master, the printed circuit board in 3D

    Stima V4 Master

    r-map/rmap

    rete monitoraggio ambientale partecipativo documentation at https://doc.rmap.cc

    177 parts55
  • 4 layers40 × 30 mmPixie device, the printed circuit board in 3D

    Pixie device

    firefly/pixie-device

    Firefly Pixie hardware wallet design, schematics and PCB

    64 parts18