Adom Wiki Skill Pack
Public Unreviewedby John Lauer
How to use the Adom Wiki without breaking pages — the wiki is six tools in one (git, adompkg, releases, discussions, PRs, discovery), and three repo archetypes have emerged from real use: Page, Skillpack, and Family. Plus how to publish rich component pages (chips, molecules, boards). One install, 15 skills, plus a write-up of the design patterns for the people who build the wiki.
name: wiki-component
description: >-
How to publish a "component" page to the Adom Wiki — a single chip, a molecule,
or a PCB that isn't a molecule. component is a real wiki page TYPE (peer to
app/skill) with NATIVE rendering: set a component block in page.json + push the
CAD files and the wiki auto-renders interactive symbol + footprint + 3D viewers,
a downloads grid, and a datasheet section. The chip page is the rich case: a
mini-datasheet-plus-CAD-hub built from Adom's own tools (chip-fetcher, ds2sf,
adom-symbol/footprint/lbr, step2glb, chipfit, chip-thumbnailer), with PROVENANCE
on every datapoint and an Open-in toolbar. Read before publishing any
chip/molecule/board. Trigger words: publish a component, component page, chip
page, publish a chip, component readme, symbol footprint 3d page, datasheet page,
molecule page, pcb component, tape and reel, pin 1 orientation, pick and place,
kicad altium orcad fusion library, parametric specs, mouser digikey price stock,
provenance, prove the data, datasheet page citation, embed symbol footprint
viewer, open chip in tool.
Parent skill: adom-wiki-skillpack
Publishing a component (chip / molecule / PCB)
component is a first-class wiki page type (alongside app and skill — see
wiki-api). Structurally a component is usually the Page archetype; chip
families use the Family archetype (see wiki-repo-styles), e.g. an stm32f4
anchor with stm32f405 / stm32f407 children.
Three kinds, by what they are:
- Chip — a single part / IC (MCU, MOSFET, sensor, passive, connector). The rich case; most of this skill.
- Molecule — a reusable sub-circuit / breakout published via
adom-molecule. - PCB (non-molecule) — a finished board not meant to be reused as a part.
Read adom-ui-design BEFORE you build the page UI. A component page is a real Adom interface and must obey it: canonical color tokens, brand fonts (Familjen Grotesk / Satoshi / JetBrains Mono, never the system stack), monochrome line-icon SVGs — NO emoji, anywhere, no em-dashes or en-dashes, a 44px three-zone header, body-appended tooltips, 8/12/999 radii. Lint with
adom-ui-linter. This was learned the hard way: an emoji- and em-dash-ridden page reads as AI slop and engineers stop trusting it.
How the page actually renders: two layers
There are two very different rendering paths. Know which you're using.
Layer A — the wiki's NATIVE component rendering (the working path today)
This is what you get for free, and it is good. Set a component block in
page.json and push the CAD files; the wiki auto-renders:
- an interactive 3D viewer (Babylon) from the
.glb, - an interactive schematic-symbol viewer (SymView) from the
.kicad_sym, - an interactive footprint viewer (FpView, with layer toggles incl. solder
blobs) from the
.kicad_mod, - a datasheet section, and a CAD downloads grid (typed icons per file).
These are served at https://wiki.adom.inc/viewer/{3d,symbol,footprint}/component/<slug>
and are genuinely interactive (drag, zoom, layer toggle). They embed anywhere
(the wiki dropped frame-ancestors), so you can <iframe> them into a custom page.
The component block:
"component": {
"mpn": "nRF52840-CKAA", // REQUIRED — POST /pages rejects a component without it
"manufacturer": "Nordic Semiconductor",
"package": "aQFN-73 (7x7x0.85 mm, 0.5 mm pitch)",
"pin_count": 73,
"category": "Microcontroller",
"subcategory": "Wireless MCU / Bluetooth LE SoC",
"body_size": { "x_mm": 7.0, "y_mm": 7.0, "z_mm": 0.85, "pitch_mm": 0.5 },
"parts": { "symbol": "x.kicad_sym", "footprint": "x.kicad_mod",
"model_3d": "x.glb", "step": "x.step", "datasheet": "docs/x.pdf" },
"distributor_links": { "mouser": "...", "digikey": "...", "jlcpcb": "..." }
}
Parts auto-detect by extension if you omit parts (first .kicad_sym/.kicad_mod/
.glb/.step/.pdf in the tree), but declare them so the right datasheet PDF
wins over the RoHS cert, etc.
Layer B — the README / custom HTML (heavily constrained)
The Overview README is rendered through marked + sanitize-html with a strict
allowlist. It strips <style>, <script>, <details>, <iframe>, and even
style= attributes. So you cannot build a tabbed/accordion/toolbar custom
layout in the README — inline styles vanish, accordions collapse to nothing, scripts
never run. (Confirmed live: a hand-built toolbar rendered as plain text links.)
README HTML that survives: h1-6, p, a, ul/ol/li, blockquote, pre, code, em, strong, table/tr/th/td, span, div, img, with class on a few. Use the README for prose +
images + tables that complement the native viewers — not for a custom app shell.
To get the full custom layout (tabs, accordions, panels, the Open-in toolbar, provenance lightbox) you have two options:
Ship a
readme.html(LIVE — verified 2026-07-15): put a self-containedreadme.htmlin the publish tree andpkg publish. The wiki renders it as the page body in a sandboxed iframe (sandbox="allow-scripts allow-downloads", served unsanitized from/readme/<owner>/<type>/<slug>?variant=public) — inline CSS AND<script>both work, so the full tabbed/accordion/toolbar/ lightbox layout is the real page now. It fully shadows README.md on the page. Noallow-same-origin: self-contain everything (base64-inline fonts/images or absolute/blob/...URLs; no wiki API calls from inside). See wiki-readme.Prototype it as a standalone page in the container (for iterating before publishing): one self-contained HTML file, base64-inline the fonts + images, inline CSS + JS, embed the live
/viewer/...iframes, then serve it withpython3 -m http.server <port>and hand the user the proxy URLhttps://<slug>.adom.cloud/proxy/<port>/. The same file, once it looks right, drops in asreadme.htmlunchanged.A reference data-driven generator ships with this skill at
component-page-generator/gen_chip.py(+template.html). Point it at a chip-fetcher dir and it emits a compliant standalone page: it readsinfo.json/stock.json/*-symbol.extracted.json/*-footprint.extracted.json/*-extraction.provenance.json+ the rendered SVGs, detects the component class (MCU / MOSFET / op-amp / sensor / power / passive) to pick the right Specs block, builds the real Provenance tab (per-pin + per-dimension datasheet page citations, cropping the cited pages withpdftoppm/ImageMagick into a click-to-enlarge lightbox), and enforces the Adom-UI rules (tokens, brand fonts, monochrome icons, NO emoji / em-dashes, 44px header, tooltips). Validated across 6 classes; adapt the absolute paths. Use it as the blueprint for either a standalone preview or the shipped custom-HTMLreadme.htmlpage.
The CHIP component page
A mini datasheet + CAD hub + sourcing desk. Canonical sections (tabs in the custom layout; stacked panels + native viewers on the live page):
Overview · Symbol · Footprint · 3D · Pin map · Specifications · Sourcing · Tape & reel · Manufacturer & resources · Variants · Related · Provenance · Open in
0. Source every artifact from Adom's tools, and USE them (don't fake it)
Never ship a static screenshot where a live viewer belongs. Generate real artifacts and embed the live interactive viewers.
| Artifact / capability | Tool | Command → output (verified) |
|---|---|---|
| STEP + KiCad sym/mod + Altium IntLib + Fusion .lbr + datasheet + stock | chip-fetcher | chip-fetcher fetch <MPN> → library/<MPN>/ (⚠ may save a product brief, not the full datasheet — verify it has the pinout, see Provenance) |
| Pin descriptions + symbol/footprint extraction + per-pin datasheet page citations | ds2sf | ds2sf extract <chip-dir> --pdf <full-datasheet.pdf> → *-symbol.extracted.json, *-footprint.extracted.json, *-provenance.json. Refuses a PDF with no pinout (won't fabricate). |
| Interactive SymView | adom-symbol (service :8781 / wiki) | wiki route /viewer/symbol/component/<slug> (embed). CLI adom-symbol render --file x.kicad_sym --out x.svg for a static SVG. |
| Interactive FpView (layer toggles + solder blobs) | adom-footprint (service :8782 / wiki) | wiki route /viewer/footprint/component/<slug> (embed). CLI render for SVG. |
| Fusion/EAGLE .lbr generated on the fly | adom-lbr | adom-lbr generate --sym x.kicad_sym -o x.lbr (works standalone; lints) |
| STEP → web GLB | step2glb | step2glb convert x.step -o x.glb |
| pin-1 + seat-plane validation + pin-1-baked GLB | adom-chipfit | adom-chipfit check --footprint x.kicad_mod --glb x.glb |
| symbol/footprint SVGs + 3D iso PNGs + manifest | chip-thumbnailer | chip-thumbnailer once <MPN> |
Generate the embeddable viewers FROM the apps — use embed
adom-symbol and adom-footprint ship a first-class embed command that exports a
self-contained, interactive HTML package (pan/zoom + pin info panel; pads +
courtyard + layer toggles) built for an iframe — no server, no external assets, one
portable .html. This is the canonical way to get the symbol/footprint viewers.
adom-symbol embed --file <mpn>.kicad_sym --out symview.html # interactive SymView
adom-footprint embed --file <mpn>.kicad_mod --out fpview.html # interactive FpView
Then embed each same-origin: <iframe src="symview.html"> / <iframe src="fpview.html">.
The footprint export includes a layers panel with an "InstaPCB paste dots" toggle
(the 300µm jetted-paste positions, off by default) plus Copper / Assembly /
Courtyard / Paste apertures — so the solder-paste view is built in. Pin 1 is marked.
Use the freshly built binaries (
<app>/target/release/adom-symbol|adom-footprint) — a stale~/.local/bincopy may predateembed(or be a stub).embedrenders via service-kicad, which must be reachable.
Two fallbacks, only if embed isn't available:
- the JS generators
generateBrandedViewer(...)/generateFootprintViewer(...)(pass a pre-renderedsvgContentto skip service-kicad), or - once the page is published, the wiki hosts the same viewer at
/viewer/{symbol,footprint,3d}/component/<slug>?embed=1(the wiki runs these generators server-side) — fine for the live page.
The shipped component-page-generator/ does this: mkviewers.sh runs
adom-symbol embed / adom-footprint embed; the page embeds symview.html /
fpview.html.
1. What goes in each section
- Overview — MPN, manufacturer, one-liner, lifecycle badge (Active / NRND / Obsolete), package, pin count, voltage, datasheet link. (Hero shows in the page header — never re-embed it, wiki-hero.)
- Symbol — embed the live SymView iframe. (Static SVG fallback below it.)
- Footprint — embed the live FpView iframe; the solder/paste layer is a real toggle there. Note pin-1 = square pad, top-left. Leaded vs lead-free + bridging feedback via Discussions.
- 3D — embed the live Babylon viewer; show the chipfit verdict (pin-1, seat Δz).
- Pin map — pin list with descriptions (ds2sf per-pin, grouped POWER/IO/…) and symbol-pin ↔ pad map. Cite the datasheet page per pin (Provenance).
- Specifications — class-aware (render the block that fits): MCU (core, clock, flash, RAM, GPIO, peripherals, V, temp); MOSFET (channel, Vds, Id, Rds(on), Vgs(th), Qg, Ciss, Pd); passive (value, tol, V, dielectric/temp-co, EIA size); op-amp (channels, GBW, slew, Vos, Ib, V±).
- Sourcing — price-break table, stock, lifecycle, RoHS, MSL (1–6 + floor life), Mouser + DigiKey buy links. Date every snapshot.
- Tape & reel — packaging (CT/T&R/tube/tray), reel qty, MSL, EIA-481 pin-1 quadrant. Authoritative orientation = the manufacturer's tape-and-reel drawing.
- Manufacturer & resources — the mfr product page + every supplemental doc (datasheet, errata, PCN, RoHS cert, app notes, reference designs, SDK, dev kits, CAD source). Don't just link the datasheet.
- Variants — symbol/footprint/3D/package variants, each with downloads.
- Related — molecules using this chip, family siblings (Family anchor), alternates.
- CAD downloads — per-tool: KiCad (
.kicad_sym+.kicad_mod+STEP+WRL), Fusion/ EAGLE (.lbr), Altium (.IntLib), OrCAD (.olb+.dra/.psm/.pad), universal STEP + GLB. (The native grid renders this automatically.) - Provenance — see its own section below. Mandatory.
- Open in — see its own section below.
2. Pin-1 / pick-and-place orientation
The footprint pin-1, the 3D pin-1 corner, and the placement zero orientation must agree or the part lands rotated 90/180°. IPC-7351: ICs pin-1 top-left; polarized two-terminal pin-1 (+) left; positive rotation CCW. ⚠ IEC 61188-7 uses bottom-left — call out which a library follows. Markers: SOIC dot/notch, QFP/QFN chamfer, BGA A1 corner, footprint pin-1 = square pad. Polarity gotcha: SMD tantalum stripe = +, SMD aluminum electrolytic stripe = −. Validate with adom-chipfit.
3. Tape & reel
Packaging (CT/T&R/tube/tray + custom Digi-Reel/MouseReel), reel qty, EIA-481 carrier (pocket referenced to sprocket holes, 4.0 mm feed pitch; pin-1 conventionally Quadrant 1), MSL 1→6. Defer to the mfr tape-and-reel drawing for orientation.
Provenance — prove every datapoint
Engineers don't trust AI yet, so prove the backing data. Every datapoint on the page must trace to a source, and the strongest claims must show the evidence.
- Cite a source for everything: identity/specs → datasheet page; price/stock →
distributor + date; CAD → the source (e.g. Ultra Librarian deeplink); 3D → the
STEP + the converter + the STEP sha256 (
features.json); RoHS → the certificate. - For datasheet-derived data (ds2sf): show the PDF page number AND a cropped image
of that page. Render page crops with
pdftoppm/ImageMagick/gs(all present in the container);ds2sfemits*-provenance.jsonwith per-pin page citations, anddatasheet-parserproduces cropped diagram PNGs. - A Provenance section/tab is mandatory: a table (Data → Source → Reference (page/version/date) → Evidence), with the cropped source-page images shown inline and click-to-enlarge (a simple lightbox), plus inline "Source: …" citations on the Specs and Pin-map sections.
- ds2sf refusing a brief is the feature, not a bug. It will not invent pin data from a PDF that lacks the pinout. ⚠ chip-fetcher sometimes saves a 2-page product brief instead of the full Product Specification (seen on nRF52840-CKAA — both "datasheet" files were the same 2-page brief). Always verify the datasheet has the pinout before relying on it; if ds2sf refuses, fetch the full datasheet (mfr site / desktop browser) and re-run.
The "Open in…" toolbar
Let the user act on the part, not just read it.
| Target | Reached by | One-click from a web page today? |
|---|---|---|
| 3D / Symbol / Footprint viewer | wiki /viewer/{3d,symbol,footprint}/component/<slug> |
✅ links / embeds, any context |
| Download CAD | /blob/component/<slug>/<file> |
✅ <a download> |
| Buy (Mouser / DigiKey) | distributor_links |
✅ |
| adom-symbol / footprint / lbr / step / chipfit / chipsmith / chip-fetcher / service-kicad | container CLI / services | ❌ no page→container bridge → paste-to-Claude prompt |
| KiCad / Fusion on desktop | adom-desktop kicad_open_* / fusion_open_* |
❌ no page→desktop bridge → paste-to-Claude prompt |
| Altium / OrCAD on desktop | — | ❌ no adom-desktop verb → download + open manually |
| Send library → Downloads + open folder | adom-desktop send_files + reveal |
❌ paste-to-Claude prompt |
| "Component Ocean" | — | not an Adom tool (a distributor); no open verb |
Why prompts: a wiki page can't run JS (README sanitized) and there's no page→desktop
bridge. So the live /viewer/... routes are real link/embed buttons; everything else
copies a one-line Claude prompt (works in any context). Context (HD webview / native
/ pup) can't be detected at runtime yet, so the prompt is context-agnostic.
Molecule pages
Published via adom-molecule (GLB + KiCad PCB + schematic + symbol/footprint JSON,
SKU owner/name/version). Show: 3D GLB, schematic, the pin map (adom-pin-mapping →
MoleculePinMapping.md), BOM, and Related (the chips it's built from, two-way links).
PCB (non-molecule) pages
A finished board, not reused as a part. Overview + 3D/photos + schematic/board downloads + BOM + assembly notes. Page archetype.
Publishing
page.jsonwith thecomponentblock (mpnrequired) + hero + tags +discovery_triggers.- Create the page:
POST /api/v1/pageswithtype:"component"andcomponent.mpnin the body (it's rejected otherwise). - Push all files (text plain, binaries base64,
User-Agentheader) in <4MB batches — GLB/STEP/PDF are big and a too-large batch returns 413. Push a completepage.jsonLAST so the hero/title stay linked (wiki-hero, wiki-publish-safely). (Noadompkg publishtarball is needed for a component.) - Verify in pup, and check
/viewer/...routes return interactive content. - For chip families, apply the Family naming/title rules (wiki-family).
📋 Platform TODO (for Colby / adom-desktop) — fold these into build asks
Custom-HTML page modeSHIPPED (verified 2026-07-15): a reporeadme.htmlrenders as the page body in a sandboxed iframe (allow-scripts allow-downloads, unsanitized) — see wiki-readme. Remaining gap: noallow-same-origin, so embedded viewers can't fetch the wiki API from inside the readme (next item).- Editable embedded viewers: let the embedded SymView/FpView tweak + regenerate in place (needs same-origin fetch in the page sandbox).
- page→desktop bridge (
window.adomDesktop/adom:/// local endpoint) + runtime context detection + adom-desktop endpoint & installed-app enumeration + a reveal-folder verb + Altium/OrCAD open verbs, to make the Open-in toolbar one-click. - Live price/stock widgets (vs dated
stock.json); leaded/lead-free paste switch + bridging heatmap in FpView; auto "molecules using this chip" backlink index; a per-class spec schema the page fills structurally. - chip-fetcher: don't save a product brief as the datasheet — verify the PDF has the pinout (so ds2sf can extract).
⏳ This skill records the live constraints as of its writing (README.md is sanitized, but
readme.htmlcustom pages SHIPPED — verified 2026-07-15; still no page→desktop bridge). Re-verify and update when the bridge ships.
---
name: wiki-component
description: >-
How to publish a "component" page to the Adom Wiki — a single chip, a molecule,
or a PCB that isn't a molecule. `component` is a real wiki page TYPE (peer to
app/skill) with NATIVE rendering: set a `component` block in page.json + push the
CAD files and the wiki auto-renders interactive symbol + footprint + 3D viewers,
a downloads grid, and a datasheet section. The chip page is the rich case: a
mini-datasheet-plus-CAD-hub built from Adom's own tools (chip-fetcher, ds2sf,
adom-symbol/footprint/lbr, step2glb, chipfit, chip-thumbnailer), with PROVENANCE
on every datapoint and an Open-in toolbar. Read before publishing any
chip/molecule/board. Trigger words: publish a component, component page, chip
page, publish a chip, component readme, symbol footprint 3d page, datasheet page,
molecule page, pcb component, tape and reel, pin 1 orientation, pick and place,
kicad altium orcad fusion library, parametric specs, mouser digikey price stock,
provenance, prove the data, datasheet page citation, embed symbol footprint
viewer, open chip in tool.
---
Parent skill: **adom-wiki-skillpack**
# Publishing a component (chip / molecule / PCB)
`component` is a first-class **wiki page type** (alongside `app` and `skill` — see
**wiki-api**). Structurally a component is usually the **Page** archetype; chip
families use the **Family** archetype (see **wiki-repo-styles**), e.g. an `stm32f4`
anchor with `stm32f405` / `stm32f407` children.
Three kinds, by what they are:
1. **Chip** — a single part / IC (MCU, MOSFET, sensor, passive, connector). The
rich case; most of this skill.
2. **Molecule** — a reusable sub-circuit / breakout published via `adom-molecule`.
3. **PCB (non-molecule)** — a finished board not meant to be reused as a part.
> **Read [adom-ui-design](https://wiki.adom.inc/john/adom-ui-design) BEFORE you build
> the page UI.** A component page is a real Adom interface and must obey it:
> canonical color tokens, brand fonts (Familjen Grotesk / Satoshi / JetBrains Mono,
> never the system stack), **monochrome line-icon SVGs — NO emoji, anywhere**, **no
> em-dashes or en-dashes**, a 44px three-zone header, body-appended tooltips, 8/12/999
> radii. Lint with `adom-ui-linter`. This was learned the hard way: an emoji- and
> em-dash-ridden page reads as AI slop and engineers stop trusting it.
---
# How the page actually renders: two layers
There are two very different rendering paths. Know which you're using.
## Layer A — the wiki's NATIVE component rendering (the working path today)
This is what you get for free, and it is good. Set a **`component` block in
page.json** and push the CAD files; the wiki auto-renders:
- an **interactive 3D viewer** (Babylon) from the `.glb`,
- an **interactive schematic-symbol viewer** (SymView) from the `.kicad_sym`,
- an **interactive footprint viewer** (FpView, with layer toggles incl. solder
blobs) from the `.kicad_mod`,
- a **datasheet** section, and a **CAD downloads grid** (typed icons per file).
These are served at `https://wiki.adom.inc/viewer/{3d,symbol,footprint}/component/<slug>`
and are genuinely interactive (drag, zoom, layer toggle). They embed anywhere
(the wiki dropped `frame-ancestors`), so you can `<iframe>` them into a custom page.
The `component` block:
```json
"component": {
"mpn": "nRF52840-CKAA", // REQUIRED — POST /pages rejects a component without it
"manufacturer": "Nordic Semiconductor",
"package": "aQFN-73 (7x7x0.85 mm, 0.5 mm pitch)",
"pin_count": 73,
"category": "Microcontroller",
"subcategory": "Wireless MCU / Bluetooth LE SoC",
"body_size": { "x_mm": 7.0, "y_mm": 7.0, "z_mm": 0.85, "pitch_mm": 0.5 },
"parts": { "symbol": "x.kicad_sym", "footprint": "x.kicad_mod",
"model_3d": "x.glb", "step": "x.step", "datasheet": "docs/x.pdf" },
"distributor_links": { "mouser": "...", "digikey": "...", "jlcpcb": "..." }
}
```
Parts auto-detect by extension if you omit `parts` (first `.kicad_sym`/`.kicad_mod`/
`.glb`/`.step`/`.pdf` in the tree), but **declare them** so the right datasheet PDF
wins over the RoHS cert, etc.
## Layer B — the README / custom HTML (heavily constrained)
The Overview README is rendered through `marked` + **`sanitize-html` with a strict
allowlist**. It **strips `<style>`, `<script>`, `<details>`, `<iframe>`, and even
`style=` attributes.** So you **cannot** build a tabbed/accordion/toolbar custom
layout in the README — inline styles vanish, accordions collapse to nothing, scripts
never run. (Confirmed live: a hand-built toolbar rendered as plain text links.)
README HTML that survives: `h1-6, p, a, ul/ol/li, blockquote, pre, code, em, strong,
table/tr/th/td, span, div, img`, with `class` on a few. Use the README for prose +
images + tables that complement the native viewers — not for a custom app shell.
**To get the full custom layout** (tabs, accordions, panels, the Open-in toolbar,
provenance lightbox) you have two options:
1. **Ship a `readme.html`** (LIVE — verified 2026-07-15): put a self-contained
`readme.html` in the publish tree and `pkg publish`. The wiki renders it as the
page body in a sandboxed iframe (`sandbox="allow-scripts allow-downloads"`,
served unsanitized from `/readme/<owner>/<type>/<slug>?variant=public`) —
inline CSS AND `<script>` both work, so the full tabbed/accordion/toolbar/
lightbox layout is the real page now. It fully shadows README.md on the page.
No `allow-same-origin`: self-contain everything (base64-inline fonts/images or
absolute `/blob/...` URLs; no wiki API calls from inside). See **wiki-readme**.
2. **Prototype it as a standalone page in the container** (for iterating before
publishing): one self-contained HTML file, **base64-inline the fonts + images**,
inline CSS + JS, embed the live `/viewer/...` iframes, then serve it with
`python3 -m http.server <port>` and hand the user the proxy URL
`https://<slug>.adom.cloud/proxy/<port>/`. The same file, once it looks right,
drops in as `readme.html` unchanged.
> **A reference data-driven generator ships with this skill** at
> `component-page-generator/gen_chip.py` (+ `template.html`). Point it at a
> chip-fetcher dir and it emits a compliant standalone page: it reads
> `info.json` / `stock.json` / `*-symbol.extracted.json` /
> `*-footprint.extracted.json` / `*-extraction.provenance.json` + the rendered
> SVGs, **detects the component class** (MCU / MOSFET / op-amp / sensor / power /
> passive) to pick the right Specs block, builds the **real Provenance** tab
> (per-pin + per-dimension datasheet page citations, cropping the cited pages
> with `pdftoppm`/ImageMagick into a click-to-enlarge lightbox), and enforces the
> Adom-UI rules (tokens, brand fonts, monochrome icons, NO emoji / em-dashes,
> 44px header, tooltips). Validated across 6 classes; adapt the absolute paths.
> Use it as the blueprint for either a standalone preview or the shipped
> custom-HTML `readme.html` page.
---
# The CHIP component page
A mini datasheet + CAD hub + sourcing desk. Canonical sections (tabs in the custom
layout; stacked panels + native viewers on the live page):
> **Overview · Symbol · Footprint · 3D · Pin map · Specifications · Sourcing ·
> Tape & reel · Manufacturer & resources · Variants · Related · Provenance · Open in**
## 0. Source every artifact from Adom's tools, and USE them (don't fake it)
Never ship a static screenshot where a live viewer belongs. Generate real artifacts
and **embed the live interactive viewers**.
| Artifact / capability | Tool | Command → output (verified) |
|---|---|---|
| STEP + KiCad sym/mod + Altium IntLib + Fusion .lbr + datasheet + stock | **chip-fetcher** | `chip-fetcher fetch <MPN>` → `library/<MPN>/` (⚠ may save a *product brief*, not the full datasheet — verify it has the pinout, see Provenance) |
| Pin descriptions + symbol/footprint extraction + **per-pin datasheet page citations** | **ds2sf** | `ds2sf extract <chip-dir> --pdf <full-datasheet.pdf>` → `*-symbol.extracted.json`, `*-footprint.extracted.json`, `*-provenance.json`. **Refuses a PDF with no pinout** (won't fabricate). |
| Interactive **SymView** | **adom-symbol** (service :8781 / wiki) | wiki route `/viewer/symbol/component/<slug>` (embed). CLI `adom-symbol render --file x.kicad_sym --out x.svg` for a static SVG. |
| Interactive **FpView** (layer toggles + solder blobs) | **adom-footprint** (service :8782 / wiki) | wiki route `/viewer/footprint/component/<slug>` (embed). CLI `render` for SVG. |
| Fusion/EAGLE **.lbr** generated on the fly | **adom-lbr** | `adom-lbr generate --sym x.kicad_sym -o x.lbr` (works standalone; lints) |
| STEP → web **GLB** | **step2glb** | `step2glb convert x.step -o x.glb` |
| pin-1 + seat-plane validation + pin-1-baked GLB | **adom-chipfit** | `adom-chipfit check --footprint x.kicad_mod --glb x.glb` |
| symbol/footprint SVGs + 3D iso PNGs + manifest | **chip-thumbnailer** | `chip-thumbnailer once <MPN>` |
### Generate the embeddable viewers FROM the apps — use `embed`
adom-symbol and adom-footprint ship a first-class **`embed`** command that exports a
**self-contained, interactive HTML package** (pan/zoom + pin info panel; pads +
courtyard + layer toggles) built for an iframe — no server, no external assets, one
portable `.html`. **This is the canonical way to get the symbol/footprint viewers.**
```bash
adom-symbol embed --file <mpn>.kicad_sym --out symview.html # interactive SymView
adom-footprint embed --file <mpn>.kicad_mod --out fpview.html # interactive FpView
```
Then embed each same-origin: `<iframe src="symview.html">` / `<iframe src="fpview.html">`.
The footprint export includes a layers panel with an **"InstaPCB paste dots" toggle**
(the 300µm jetted-paste positions, off by default) plus Copper / Assembly /
Courtyard / Paste apertures — so the solder-paste view is built in. Pin 1 is marked.
> Use the freshly **built** binaries (`<app>/target/release/adom-symbol|adom-footprint`)
> — a stale `~/.local/bin` copy may predate `embed` (or be a stub). `embed` renders
> via service-kicad, which must be reachable.
Two fallbacks, only if `embed` isn't available:
- the JS generators `generateBrandedViewer(...)` / `generateFootprintViewer(...)`
(pass a pre-rendered `svgContent` to skip service-kicad), or
- once the page is **published**, the wiki hosts the same viewer at
`/viewer/{symbol,footprint,3d}/component/<slug>?embed=1` (the wiki runs these
generators server-side) — fine for the live page.
The shipped `component-page-generator/` does this: `mkviewers.sh` runs
`adom-symbol embed` / `adom-footprint embed`; the page embeds `symview.html` /
`fpview.html`.
## 1. What goes in each section
- **Overview** — MPN, manufacturer, one-liner, lifecycle badge (Active / NRND /
Obsolete), package, pin count, voltage, datasheet link. (Hero shows in the page
header — never re-embed it, **wiki-hero**.)
- **Symbol** — embed the live SymView iframe. (Static SVG fallback below it.)
- **Footprint** — embed the live FpView iframe; the solder/paste layer is a real
toggle there. Note pin-1 = square pad, top-left. Leaded vs lead-free + bridging
feedback via Discussions.
- **3D** — embed the live Babylon viewer; show the chipfit verdict (pin-1, seat Δz).
- **Pin map** — pin list with descriptions (ds2sf per-pin, grouped POWER/IO/…) and
symbol-pin ↔ pad map. **Cite the datasheet page per pin** (Provenance).
- **Specifications** — **class-aware** (render the block that fits): MCU (core,
clock, flash, RAM, GPIO, peripherals, V, temp); MOSFET (channel, Vds, Id, Rds(on),
Vgs(th), Qg, Ciss, Pd); passive (value, tol, V, dielectric/temp-co, EIA size);
op-amp (channels, GBW, slew, Vos, Ib, V±).
- **Sourcing** — price-break table, stock, lifecycle, RoHS, MSL (1–6 + floor life),
Mouser + DigiKey buy links. Date every snapshot.
- **Tape & reel** — packaging (CT/T&R/tube/tray), reel qty, MSL, EIA-481 pin-1
quadrant. Authoritative orientation = the manufacturer's tape-and-reel drawing.
- **Manufacturer & resources** — the mfr product page + **every** supplemental doc
(datasheet, errata, PCN, RoHS cert, app notes, reference designs, SDK, dev kits,
CAD source). Don't just link the datasheet.
- **Variants** — symbol/footprint/3D/package variants, each with downloads.
- **Related** — molecules using this chip, family siblings (Family anchor), alternates.
- **CAD downloads** — per-tool: KiCad (`.kicad_sym`+`.kicad_mod`+STEP+WRL), Fusion/
EAGLE (`.lbr`), Altium (`.IntLib`), OrCAD (`.olb`+`.dra`/`.psm`/`.pad`), universal
STEP + GLB. (The native grid renders this automatically.)
- **Provenance** — see its own section below. Mandatory.
- **Open in** — see its own section below.
## 2. Pin-1 / pick-and-place orientation
The footprint pin-1, the 3D pin-1 corner, and the placement **zero orientation**
must agree or the part lands rotated 90/180°. IPC-7351: ICs pin-1 **top-left**;
polarized two-terminal pin-1 (+) **left**; positive rotation CCW. ⚠ IEC 61188-7 uses
**bottom-left** — call out which a library follows. Markers: SOIC dot/notch, QFP/QFN
chamfer, BGA A1 corner, footprint pin-1 = square pad. Polarity gotcha: SMD tantalum
stripe = +, SMD aluminum electrolytic stripe = −. Validate with **adom-chipfit**.
## 3. Tape & reel
Packaging (CT/T&R/tube/tray + custom Digi-Reel/MouseReel), reel qty, EIA-481 carrier
(pocket referenced to sprocket holes, 4.0 mm feed pitch; pin-1 conventionally
Quadrant 1), MSL 1→6. Defer to the mfr tape-and-reel drawing for orientation.
---
# Provenance — prove every datapoint
**Engineers don't trust AI yet, so prove the backing data.** Every datapoint on the
page must trace to a source, and the strongest claims must show the evidence.
- **Cite a source for everything**: identity/specs → datasheet page; price/stock →
distributor + date; CAD → the source (e.g. Ultra Librarian deeplink); 3D → the
STEP + the converter + the STEP sha256 (`features.json`); RoHS → the certificate.
- **For datasheet-derived data (ds2sf): show the PDF page number AND a cropped image
of that page.** Render page crops with `pdftoppm`/ImageMagick/`gs` (all present in
the container); `ds2sf` emits `*-provenance.json` with per-pin page citations, and
`datasheet-parser` produces cropped diagram PNGs.
- **A Provenance section/tab is mandatory**: a table (Data → Source → Reference
(page/version/date) → Evidence), with the cropped source-page images shown inline
and click-to-enlarge (a simple lightbox), plus inline "Source: …" citations on the
Specs and Pin-map sections.
- **ds2sf refusing a brief is the feature, not a bug.** It will not invent pin data
from a PDF that lacks the pinout. ⚠ **chip-fetcher sometimes saves a 2-page product
brief instead of the full Product Specification** (seen on nRF52840-CKAA — both
"datasheet" files were the same 2-page brief). Always verify the datasheet has the
pinout before relying on it; if ds2sf refuses, fetch the full datasheet (mfr site /
desktop browser) and re-run.
---
# The "Open in…" toolbar
Let the user *act* on the part, not just read it.
| Target | Reached by | One-click from a web page today? |
|---|---|---|
| 3D / Symbol / Footprint viewer | wiki `/viewer/{3d,symbol,footprint}/component/<slug>` | ✅ links / embeds, any context |
| Download CAD | `/blob/component/<slug>/<file>` | ✅ `<a download>` |
| Buy (Mouser / DigiKey) | `distributor_links` | ✅ |
| adom-symbol / footprint / lbr / step / chipfit / chipsmith / chip-fetcher / service-kicad | container CLI / services | ❌ no page→container bridge → **paste-to-Claude prompt** |
| KiCad / Fusion on desktop | `adom-desktop kicad_open_* / fusion_open_*` | ❌ no page→desktop bridge → **paste-to-Claude prompt** |
| Altium / OrCAD on desktop | — | ❌ no adom-desktop verb → download + open manually |
| Send library → Downloads + open folder | `adom-desktop send_files` + reveal | ❌ paste-to-Claude prompt |
| "Component Ocean" | — | not an Adom tool (a distributor); no open verb |
Why prompts: a wiki page can't run JS (README sanitized) and there's no page→desktop
bridge. So the live `/viewer/...` routes are real link/embed buttons; everything else
copies a one-line Claude prompt (works in any context). Context (HD webview / native
/ pup) can't be detected at runtime yet, so the prompt is context-agnostic.
---
# Molecule pages
Published via **adom-molecule** (GLB + KiCad PCB + schematic + symbol/footprint JSON,
SKU `owner/name/version`). Show: 3D GLB, schematic, the pin map (`adom-pin-mapping` →
`MoleculePinMapping.md`), BOM, and Related (the chips it's built from, two-way links).
# PCB (non-molecule) pages
A finished board, not reused as a part. Overview + 3D/photos + schematic/board
downloads + BOM + assembly notes. Page archetype.
---
# Publishing
1. `page.json` with the **`component` block** (`mpn` required) + hero + tags +
`discovery_triggers`.
2. Create the page: `POST /api/v1/pages` with `type:"component"` **and `component.mpn`
in the body** (it's rejected otherwise).
3. Push all files (text plain, binaries base64, `User-Agent` header) in **<4MB
batches** — GLB/STEP/PDF are big and a too-large batch returns **413**. Push a
**complete `page.json` LAST** so the hero/title stay linked (**wiki-hero**,
**wiki-publish-safely**). (No `adompkg publish` tarball is needed for a component.)
4. **Verify in pup**, and check `/viewer/...` routes return interactive content.
5. For chip families, apply the Family naming/title rules (**wiki-family**).
## 📋 Platform TODO (for Colby / adom-desktop) — fold these into build asks
- ~~**Custom-HTML page mode**~~ **SHIPPED** (verified 2026-07-15): a repo
`readme.html` renders as the page body in a sandboxed iframe
(`allow-scripts allow-downloads`, unsanitized) — see **wiki-readme**. Remaining
gap: no `allow-same-origin`, so embedded viewers can't fetch the wiki API from
inside the readme (next item).
- **Editable embedded viewers**: let the embedded SymView/FpView tweak + regenerate
in place (needs same-origin fetch in the page sandbox).
- **page→desktop bridge** (`window.adomDesktop` / `adom://` / local endpoint) +
**runtime context detection** + **adom-desktop endpoint & installed-app
enumeration** + a **reveal-folder** verb + **Altium/OrCAD open verbs**, to make the
Open-in toolbar one-click.
- **Live price/stock** widgets (vs dated `stock.json`); **leaded/lead-free paste
switch + bridging heatmap** in FpView; **auto "molecules using this chip" backlink
index**; a **per-class spec schema** the page fills structurally.
- **chip-fetcher**: don't save a product brief as the datasheet — verify the PDF has
the pinout (so ds2sf can extract).
> ⏳ This skill records the live constraints as of its writing (README.md is
> sanitized, but `readme.html` custom pages SHIPPED — verified 2026-07-15; still
> no page→desktop bridge). Re-verify and update when the bridge ships.