
217A dttrainer rev4
researchanddesire/assembly-docs
RAD unified assembly docs — ohai.researchanddesire.com

RAD unified assembly docs — ohai.researchanddesire.com
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.
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.
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.
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:
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 changesworkflow_dispatchProducts 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.
pip install -r requirements.txt
# Assemble from local checkouts (skips cloning):
ASSEMBLE_LOCAL="$HOME/Github" ./scripts/assemble-docs.sh
mkdocs serveWithout 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).
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.
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.)
| Thing | Path |
|---|---|
| BOM data (source of truth, per product repo) | hardware/bom.csv |
| Renderer | scripts/render_bom.py |
| Category code → label → colour map (single source) | scripts/bom_categories.py |
| Chip / table structure + focus styles | docs/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 assembly | scripts/split_pcb_design_assets.py + scripts/insert_kicanvas_pcb.py |
| Cable harness source files | Product 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.
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.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.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.bom.md has no markers, or its bom.csv is a header-only
template, the page is left untouched..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.
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-markersassembly-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/**.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.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.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.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 10 | 0.1u | Capacitor_SMD:C_0402_1005Metric | C1, C4, C5, C6, C7, C16, C17, C18, C19, C23 |
| 8 | 10k | Resistor_SMD:R_0402_1005Metric | R2, R8, R9, R13, R14, R16, R19, R22 |
| 5 | 100u | Capacitor_SMD:C_1206_3216Metric | C8, C9, C10, C11, C12 |
| 5 | 1u | Capacitor_SMD:C_0402_1005Metric | C3, C15, C20, C21, C22 |
| 5 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4, H5 |
| 4 | 2k | Resistor_SMD:R_0402_1005Metric | R1, R6, R7, R15 |
| 4 | SW_Push | Button_Switch_THT:SW_PUSH_6mm_H8mm | SW2, SW5, SW7, SW8 |
| 3 | 10 | Resistor_SMD:R_0603_1608Metric | R4, R5, R17 |
| 3 | 10u | Capacitor_SMD:C_0402_1005Metric | C2, C13, C14 |
| 3 | B5819W | Diode_SMD:D_SOD-123 | D2, D3, D4 |
| 3 | TMR2101SO | Package_TO_SOT_SMD:SOT-23 | U8, U9, U10 |
| 2 | 100k | Resistor_SMD:R_0402_1005Metric | R12, R20 |
| 2 | 5.1k | Resistor_SMD:R_0402_1005Metric | R10, R11 |
| 2 | ME6211C33M5 | Package_TO_SOT_SMD:SOT-23-5 | U4, U11 |
| 2 | TCS40DPR,LF | Package_TO_SOT_SMD:SOT-23 | U6, U7 |
| 2 | TestPoint | TestPoint:TestPoint_Pad_1.0x1.0mm | TP1, TP2 |
| 1 | 0.1 | Resistor_SMD:R_0603_1608Metric | R3 |
| 1 | 33 | Resistor_SMD:R_0805_2012Metric | R18 |
| 1 | AFC01-S14FCA-00 | Lockbox:JUSHUO_AFC01-S14FCA-00 | J4 |
| 1 | AO3400 | Package_TO_SOT_SMD:SOT-23 | Q2 |
| 1 | DRV8210DSGR | Package_SON:WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mm | U3 |
| 1 | ESP32-S3-WROOM-1 | Lockbox:ESP32-S3-WROOM-1-FIXED | U1 |
| 1 | INA219AIDCN | Package_TO_SOT_SMD:SOT-23-8 | U5 |
| 1 | LED_Small | LED_SMD:LED_0603_1608Metric | D1 |
| 1 | PEC12R-2120F-N0012 | Rotary_Encoder:RotaryEncoder_Bourns_Horizontal_PEC12R-2x17F-Nxxxx | SW6 |
| 1 | Q_PMOS_DGS | Package_TO_SOT_SMD:SOT-23 | Q3 |
| 1 | S2B-PH-SM4-TB(LF)(SN) | Connector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_Horizontal | J2 |
| 1 | ST6519 | Lockbox:ST_UDFN-6_1.0x1.45mm_P0.5mm | U12 |
| 1 | SW_Push | Lockbox:SW_SPST_TSB008A2518A | SW1 |
| 1 | SW_SPDT | Button_Switch_THT:SW_CK_JS202011AQN_DPDT_Angled | SW3 |
| 1 | Si2301 | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | TP4054 | Package_TO_SOT_SMD:SOT-23-5_HandSoldering | U2 |
| 1 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J3 |
| 1 | ~ | Connector_JST:JST_SH_SM02B-SRSS-TB_1x02-1MP_P1.00mm_Horizontal | J1 |
It measures 42 × 100 mm and has 4 copper layers, 1.6 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask researchanddesire before reusing the design.

researchanddesire/assembly-docs
RAD unified assembly docs — ohai.researchanddesire.com



daedalus-ind/icarus-hardware
Hardware of the onboard flight computer for the Icarus rocket.

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.


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

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