← Commit history
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"-}\ No newline at end of file+}
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" }\ No newline at end of file
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}"));                 }