app
Adom Chip Thumbnailer
Public Made by Adomby adom
The chip-icon factory: from a STEP file it renders the complete family of chip icons, shaded 3D orientations, transparent icons, name-lasered variants, and 11 vector outline styles, in a live web app + CLI.
← Commit history
Publish 1.0.2
6 files changed
+124−34
adom-chip-thumbnaileradded⋯ 1 unchanged line ⋯
demo/chip-thumbnailer-demo-script.mdadded+105@@ -0,0 +1,105 @@+# chip-thumbnailer 0.2.0 — feature tour++**Target duration:** 1:15–1:30+**Recorded:** 2026-05-05+**Final output:** `~/project/recordings/chip-thumbnailer-0.2.0-tour.webm`+**Local review:** `/home/adom/project/.smoke/chip-thumbs/` (wiki upload deferred until auth migration completes)+**Wiki target:** `apps/chip-thumbnailer` (deferred)+**Hero frame:** `00:25` of scene 3 (chip-thumbnailer once output mid-render)++## Dependencies++- `chip-thumbnailer 0.2.0` — built at `/home/adom/project/chip-thumbnailer/target/release/chip-thumbnailer`+- `step2glb 0.6.2` — installed at `/usr/local/bin/step2glb`+- `service-step2glb 0.4.2` — reachable at the shared service URL+- `adom-tts` — for TTS via `say` subcommand (Andrew Multilingual Neural)+- `adom-cli hydrogen` — for recording + captions+- `video-post` — for manifest + storyboard review++## Recording config++- **Surface:** Hydrogen recording (workspace iframe via MediaRecorder)+- **Voice:** `en-US-AndrewMultilingualNeural`+- **Rate:** default+- **Workspace split:** 0.30 (VS Code / chat left, gallery webview right)+- **Captions:** on, via `adom-cli hydrogen caption show`++## Scenes++| # | id | Caption (on-screen) | Narration (phonetics applied per tts-pronunciation) | Target | Driver actions |+|---|---|---|---|---|---|+| 1 | intro | `chip-thumbnailer 0.2.0` | `Chip thumbnailer renders symbol, footprint, and three D thumbnails for every chip in your chip fetcher library.` | 8s | terminal: `chip-thumbnailer --version` then `chip-thumbnailer --help \| head -20` |+| 2 | before | `library/VL53L8CX/ — sources only` | `Here's a chip in the library. We've got the key cad symbol, the key cad footprint, and the step file. No thumbnails yet.` | 8s | terminal: `ls library/VL53L8CX/` showing only `.kicad_sym`, `.kicad_mod`, `.step`, `info.json` |+| 3 | render | `chip-thumbnailer once VL53L8CX` | `Run once. Kai cad C L I exports the symbol S V G, ported regex applies the Adom dark theme. Same for the footprint on the F P view grid. Step to G L B to P N G via O C C T offscreen — small, medium, and large.` | 18s | terminal: `chip-thumbnailer once VL53L8CX`; the OK lines stream in for sym, fp, 3d-sm, 3d, 3d-lg, manifest |+| 4 | output | `Six new files + manifest` | `Six new files landed next to the source. Symbol S V G, footprint S V G, three sizes of three D P N G — and a thumbs dot J S O N manifest.` | 8s | terminal: `ls -la library/VL53L8CX/` highlighting the new files |+| 5 | gallery | `Three chips · sm md lg per chip` | `All three example chips rendered. The vee ell five three L eight C X — a tof sensor. The D M G two three oh five — a P channel mosfet. And the A D S one three one M oh four — a twenty four bit A D C.` | 15s | activate gallery webview tab showing review.html; small auto-scroll |+| 6 | manifest | `<MPN>-thumbs.json — self-describing` | `Each chip gets a thumbs dot J S O N manifest. Canonical Adom palette, every file with dimensions and byte count, and a full fidelity block per kind pointing at the Adom app to launch — adom step for three D, sym view for symbols, F P view for footprints. Plus A I hints for downstream apps.` | 18s | gallery webview: click a `<details>` to expand the manifest, scroll the JSON briefly |+| 7 | handoff | `Click through → adom-step view` | `When the user wants more than the thumbnail, hand off to the full fidelity tool. adom step view opens the source step with measure, components browser, pin detection.` | 12s | terminal: `adom-step view library/VL53L8CX/VL53L8CX.step` — the adom-step Hydrogen tab opens with the chip loaded |++Total: ~87 s. Add ~3 s pad per scene for cuts → ~1:25 final after concat.++## Captions table++| Scene | Caption text shown via `adom-cli hydrogen caption show` |+|---|---|+| 1 | `chip-thumbnailer 0.2.0` |+| 2 | `library/VL53L8CX/ — sources only` |+| 3 | `chip-thumbnailer once VL53L8CX` |+| 4 | `Six new files + manifest` |+| 5 | `Three chips · sm md lg per chip` |+| 6 | `<MPN>-thumbs.json — self-describing` |+| 7 | `Click through → adom-step view` |++## Reproduction++```bash+cd /home/adom/project/chip-thumbnailer+node demo/gen_tts.py # render each scene's narration via `adom-tts say`+python3 demo/record.py # drive the per-scene Hydrogen recording loop+python3 demo/mux.py # mux TTS + raw clips into <id>-narrated.webm + manifest add+video-post storyboard /tmp/chip-thumbnailer-manifest.json --tab-name "video-post: chip-thumbnailer review"+# review each clip with the user+ffmpeg -f concat -safe 0 -i /tmp/chip-thumbnailer-clips.txt -c copy \+ ~/project/recordings/chip-thumbnailer-0.2.0-tour.webm+ffmpeg -ss 00:00:25 -i ~/project/recordings/chip-thumbnailer-0.2.0-tour.webm \+ -frames:v 1 ~/project/.smoke/chip-thumbs/__hero.png+# Wiki upload deferred until auth migration completes:+# adom-wiki asset upload apps/chip-thumbnailer --asset-type video --file <final>.webm ...+```++## Pronunciation overrides used (cross-check tts-pronunciation/pronunciations.json)++| Term | Narration spelling |+|---|---|+| `chip-thumbnailer` | `chip thumbnailer` |+| `chip-fetcher` | `chip fetcher` |+| `KiCad` | `key cad` |+| `OCCT` | `O C C T` |+| `SVG` | `S V G` |+| `PNG` | `P N G` |+| `GLB` | `G L B` |+| `JSON` | `J S O N` |+| `ADC` | `A D C` |+| `MOSFET` | `mosfet` |+| `ToF` | `tof` |+| `VL53L8CX` | `vee ell five three L eight C X` |+| `DMG2305UX-7` | `D M G two three oh five` |+| `ADS131M04IPBSR` | `A D S one three one M oh four` |+| `FpView` | `F P view` |+| `SymView` | `sym view` |+| `adom-step` | `adom step` |+| `0.2.0` | `point two point oh` (or `zero point two point zero` if Andrew gets mid-sentence "point" wrong) |++## Workspace setup++- Hydrogen workspace with two-pane split, ratio 0.30+- **Left pane** (30%): VS Code terminal pinned to `/home/adom/project/chip-thumbnailer/`+- **Right pane** (70%): Hydrogen webview tab pointed at `https://gallery-igqvywx7jb2z.adom.cloud/review.html`+- Pre-warm the gallery once before recording so the SVGs are loaded+- Pre-clear `~/project/recordings/` so we don't conflate with old takes++## Known issues / risks++- Wiki publish step deferred — Drew/Colby auth migration in progress. Demo lands locally; upload command is in the reproduction block ready to run when auth restores.+- Scene 3 is ~18 s wall-clock but `chip-thumbnailer once` for VL53L8CX takes ~10 s (3D rendering across three sizes is the long pole). If the natural flow is shorter, hold the last frame with `tpad` per the skill's mux pattern.+- Scene 7's `adom-step view` will pop a Hydrogen webview tab — that's expected; we let it land for a moment then stop the recording.
package.json+6−23@@ -1,28 +1,11 @@ { "slug": "adom-chip-thumbnailer",- "version": "1.0.1",+ "version": "1.0.2", "type": "app",- "description": "Renders every thumbnail kind for a adom-chip-fetcher part \u2014 themed symbol & footprint SVGs, OCCT-direct 3D from six angles, and five vector-outline styles.",+ "description": "Renders crisp PNG thumbnails of a chip's 3D model (6 orientations x 3 sizes) from its STEP file, server-side, for library cards and previews.",+ "tags": ["thumbnail", "3d", "step", "chip", "render", "eda"],+ "hero": { "type": "image", "path": "adom-chip-thumbnailer.png" }, "dependencies": {},- "tags": [- "eda",- "symbol",- "thumbnail",- "render",- "3d",- "occt"- ],- "scripts": {- "install": "./install.sh",- "uninstall": "./uninstall.sh"- },- "install": {- "binary_name": "adom-chip-thumbnailer"- },- "needs_sudo": false,- "hero": {- "type": "image",- "path": "adom-chip-thumbnailer.png"- },+ "scripts": { "install": "./install.sh", "uninstall": "./uninstall.sh" }, "license": "MIT"-}+}
page.json+9−7@@ -1,16 +1,16 @@ { "slug": "adom-chip-thumbnailer",- "version": "1.0.1",+ "version": "1.0.2", "type": "app",- "description": "Renders every thumbnail kind for a adom-chip-fetcher part \u2014 themed symbol & footprint SVGs, OCCT-direct 3D from six angles, and five vector-outline styles.",+ "description": "Renders crisp PNG thumbnails of a chip's 3D model (6 orientations x 3 sizes) from its STEP file, server-side, for library cards and previews.", "dependencies": {}, "tags": [- "eda",- "symbol", "thumbnail",- "render", "3d",- "occt"+ "step",+ "chip",+ "render",+ "eda" ], "scripts": { "install": "./install.sh",@@ -27,5 +27,7 @@ "name": "John Lauer", "email": "[email protected]" },- "source_visibility": "public"+ "source_visibility": "public",+ "license": "MIT",+ "org": "adom" }
src/cli.rs+1−1@@ -270,7 +270,7 @@ pub fn rerender_cmd(args: RerenderArgs) { pub fn health_cmd() { let kicad_ok = ProcCommand::new("kicad-cli").arg("version").output().is_ok();- let step2glb_ok = ProcCommand::new("step2glb").arg("--version").output().is_ok();+ let step2glb_ok = ProcCommand::new("adom-step2glb").arg("--version").output().is_ok(); let svc_ok = ureq::get("https://step2glb-gmdoncpxdwx0.adom.cloud/health") .timeout(std::time::Duration::from_secs(5)) .call()
src/render_3d.rs+3−3@@ -92,7 +92,7 @@ fn ensure_features(step: &Path, chip: &ChipPaths) { // service's async 202 (which the CLI doesn't poll) — that's a non-fatal // metadata miss, so capture output rather than letting a misleading // "feature extraction failed" line leak to the user.- let _ = std::process::Command::new("step2glb")+ let _ = std::process::Command::new("adom-step2glb") .arg("features") .arg(step) .arg("--out")@@ -155,7 +155,7 @@ fn poll_and_write(svc: &str, job_id: &str, out: &Path) -> Result<()> { .and_then(|t| serde_json::from_str(&t).ok()) .unwrap_or(serde_json::Value::Null); match v.get("status").and_then(|s| s.as_str()) {- Some("complete") => {+ Some("complete") | Some("done") | Some("succeeded") => { let res = ureq::get(&format!("{svc}/jobs/{job_id}/result")) .set("X-Client", "chip-thumbnailer/chip-fetcher") .set("X-Job-Name", "result")@@ -164,7 +164,7 @@ fn poll_and_write(svc: &str, job_id: &str, out: &Path) -> Result<()> { .map_err(|e| anyhow!("GET job result: {e}"))?; return write_reader(res, out); }- Some("failed") => {+ Some("failed") | Some("error") => { let msg = v.get("error").and_then(|s| s.as_str()).unwrap_or("unknown"); return Err(anyhow!("service job failed: {msg}")); }