Parts Search
Public Made by Adomby adom
One search box across Mouser, DigiKey and JLCPCB: parallel queries, side-by-side product photos, and a Mouser-preferred recommendation that reasons around stock and lead time.
Changelog
2.0.4 (2026-08-25)
Module 2.4.0: the panel gutter check now measures against the containing block
- Re-vendored newbie-panel.js at 2.4.0 (107620 bytes, sha256 7e01711c...e604). The new conformance row measures the panel against ITS OWN CONTAINER rather than documentElement, which this app raised: the old yardstick assumed the page scrolls, so it failed any dashboard built on the app-shell pattern (fixed shell, 44px header, scroller on an inner element) by exactly one scrollbar width, while passing pages that happen to scroll at document level. Nothing in this app changed: the structure, the inner scroller and the 16px gutter all stay, and the 702px panel inside a 734px container is correct under the corrected check.
2.0.3 (2026-08-25)
Module upgraded to adom-ui-design 2.1.1
- Re-vendored assets/module/newbie-panel.js from a clean 2.1.1 install (105713 bytes, sha256 1df6d7cd...e73c). Picks up three upstream changes: selfCheck now accepts both the used and the declared border width (it would have failed a correct panel on surfaces reporting the declared value), onToggle carries a source argument so an app cannot feed its own open/close calls back into its graduation policy, and the header toggle tooltip swaps with state.
2.0.2 (2026-08-25)
Fix the dead listener that stopped the page script and left no panel
- 2.0.0 and 2.0.1 rendered NO prompts panel on John machine. Root cause was mine: deleting the hand-rolled panel left three references to elements that no longer exist, and $('#btnDemo').addEventListener threw an uncaught TypeError at the top level of the script, which halted everything after it, including the line that schedules the state poll. No poll meant no phrases, and no phrases meant no mount, so the symptom (module loaded, panel absent) looked like a module problem and was not.
- Removed the dead listener, the graduation calls the module now owns, and repointed the say-close drive id at the header toggle. Added an id audit: every id referenced from JS is now checked against the markup at build time in the release checklist.
- Diagnosis note for the build skill: the page posts its console to the instance that SERVED it, so reading /console in the developer container shows nothing about the user's dashboard. Read the page own console through the webview instead.
2.0.1 (2026-08-25)
The panel mount now retries, and its failures are visible
- 2.0.0 could leave the dashboard with NO prompts panel: renderSay committed the phrase list BEFORE mounting, so if the mount threw or the module was not ready on the first poll, every later poll short-circuited on the equality check and never tried again. pollState wraps its body in a bare catch, so the reason was swallowed silently. Measured live in John ah: module loaded, phrases served, panel absent.
- The mount is now attempted until it succeeds, the phrase list is committed only after a successful mount, and any failure is logged to the console (and therefore to GET /console) instead of vanishing.
2.0.0 (2026-08-25)
The prompts panel is now the SHARED MODULE, not ours
- Mounts adom-ui-design 2.0.0 assets/module/newbie-panel.js, vendored verbatim and served next to the dashboard. The module owns the card, the two-column grid and its collapse (a container query on the panel box, not a viewport width), the table, the 40px row, both icons in one aligned 72px column, the clipboard path, the send path with its version gate and three-state verification, the toasts, the tooltips, the X, the header toggle and the open/closed memory. This app now owns only its phrases, its noun, and what the demo button does.
- DELETED the hand-rolled panel: all 12 remaining .say* rules (pill era and panel era), the markup, and the state machine. Leaving them beside the module is how the teal demo button was lost to source order twice.
- Added two same-origin proxy routes, /updater/status and /ai-threads/run-prompt, so the module gates and sends through this server rather than reaching across origins from the page.
- Major bump because the panel implementation changed hands: same contract, different owner.
1.4.6 (2026-08-25)
Prompt phrases lead with the noun and fit the cell
- Measured in John ah: two of six phrases truncated at his resting 744px pane, and because the trigger noun trailed every phrase, the ellipsis ate "parts search" itself, which is the one thing the panel exists to teach. All six phrases now LEAD with "with parts search," so a clip costs a detail rather than the routing words, and all six are shortened to clear the ~336px clipping span with margin.
- The build skill gains the authoring rule and the probe method: measure the rendered width with an off-DOM probe span against the clipping SPAN, never the cell, which carries the overflow property and always reads as fitting.
1.4.5 (2026-08-25)
The 1.4.3 demo-button fix was itself broken
- 1.4.3 claimed to scope the demo button rule to .say .demo-btn so it would beat the shared .btn background. The edit double-prefixed it into ".say .say .demo-btn", a selector that requires a .say inside a .say and therefore never matches any element, so the rule was dead and .btn kept painting the button surface. Measured in John ah on 1.4.4: rgb(28,33,40) where teal belongs. Collapsed to a single .say prefix and removed a duplicated :active rule.
1.4.4 (2026-08-25)
Panel collapse moves to the current fleet number, 700px
- The published breakpoint moved 620px to 700px in adom-ui-design 1.34.0 after another app measured that two columns at the narrow state truncated the qualifier the prompts exist to teach. This app was one version stale at 620.
- What it means on John machine: with the dock rail CLOSED his pane is 744px, above 700, so the panel stays two columns while he reads. With the rail OPEN it is 632px, below 700, so the panel drops to one column while he is launching something and looking at the rail rather than the prompts. Both rail states are now in the test matrix.
1.4.3 (2026-08-25)
Panel heading spans the panel; the demo button is filled again
- The "Say it" heading and its explainer now span the full panel above both columns (grid-template-areas), instead of sitting inside the prompts column. Found in a live measurement of John ah by the dock thread.
- The demo button is the panel ONLY filled button again. It was rendering as a ghost because .demo-btn and .btn are both single-class selectors and .btn is declared later in the sheet, so its surface background silently won on source order; the rule is now scoped to .say .demo-btn.
- Fixed malformed panel markup: a stray closing div ended the heading early, which dropped the right column entirely and left the prompts table as a bare grid child. The section is balanced now (4 open, 4 close).
1.4.2 (2026-08-25)
The panel left column actually shrinks at the narrow end
minmax(180px, 220px)never reached 180: a minmax track resolves to its MAX whenever the neighbouring 1fr track can shrink, and this panel sets min-width:0 on those tracks, so the left column was pinned at 220px at every width including 620px, where the phrase column needs the space most. It is now clamp(180px, 30%, 220px), which resolves against the container: 180px at 620px, about 200px at John's 744px dock pane, and the full 220px from 853px up.
1.4.1 (2026-08-25)
Panel collapses at 620px, not 720px
- The two-column panel now collapses at 620px (adom-ui-design 1.25.0), and the left column is minmax(180px, 220px) rather than a hard 220px. The dock pane band is roughly 744px to 853px, so any collapse above 620 risks hiding the two-column layout in the exact pane it was designed for while every structural check still passes. 744px is now in the test matrix; the general lesson is that a breakpoint bug is invisible to anyone whose test widths straddle it (1280 and 390 both miss 744).
1.4.0 (2026-08-25)
The full 1.22.1 visual contract, in-page demo captions, and two launch-path fixes
- The newbie panel is now the contract shape: ONE full-width band, a sibling of the app body, in two columns (220px and the rest, 24px gap, hairline between) with the demo button alone on the left as the panel's only filled button.
- Prompts are a TABLE, not pills: 40px rows with hairline dividers, the phrase truncating with an ellipsis, and a fixed 72px action cell that tracks the phrase rather than the window edge, so the actions never strand 2000px from their text on a wide monitor.
- Copy and Send are the pack's shipped action-copy.svg and action-send.svg at 16px in 28x28 ghosts, muted at rest and teal on hover, each with a 44px touch target, a tooltip, a matching aria-label, and a toast.
- The panel X now FULLY closes the panel: the folded one-liner is gone and the app content moves up. The header ? still toggles the same state.
- Header: 16px padding inside the 44px edge-to-edge bar, the app mark is now literally the same favicon.svg file the dock uses, the name is 600/15 in --text rather than teal, and the cog is the pack's settings-cog-outline.svg.
- Demo captions render IN-PAGE instead of on the desktop (adom-ui-design 1.24.0: captions belong on the surface the demo drives, and this demo drives this page). No desktop_caption calls remain.
- LED short states are emitted by the SERVER and rendered verbatim; the page no longer truncates prose, which is what produced "in talled and pinned" on another dashboard.
- Launch path: the install step no longer uses skip_if command -v, which skipped the install whenever ANY version existed and so never delivered fixes to a user who already had the app. It is install-or-update now. The dashboard HTML is served no-store, must-revalidate so an updated app cannot serve a stale page, and serve self-backgrounds with setsid and only retires a process that genuinely answers as this app on that port.
1.3.5 (2026-08-24)
The header ? is a real toggle, and the prompts panel reads properly on a phone
- FIXED (John, in his ah): the header ? did not toggle the prompts panel. It only ever restored it, and it wrote a session-only "recall" flag while the panel X wrote a separate graduation flag, so the two controls drove different state and could drift: pressing ? after an X did not undo the X, and neither choice survived a reload.
- The ?, the panel X, and the Settings toggle now drive ONE persisted value, so they cannot disagree. Press ? to close, press again to open, and the choice survives a reload. The ? reports state two ways per input-feedback (aria-pressed plus a teal glyph on an inset background), and its label and tooltip swap between Hide and Show the prompts panel.
- localStorage keys are namespaced with the app slug now (the origin does not isolate apps), migrating the old un-namespaced graduation state on first load.
- Phone width: prompt chips become full-width rows, so a phrase no longer wraps inside a pill, Send to AI no longer breaks across two lines, and the curly quotes hug their words instead of orphaning at the row edges. Found by LOOKING at the 390px frame; the measurements alone all passed.
1.3.4 (2026-08-24)
Skill updates: check the wiki inbox, and verify on the instance the dock runs
- The build skill now opens with the inbox rule:
adom-wiki inboxis the only place issue comments, closures and @mentions surface, nothing pushes them, and an unread inbox looks exactly like a quiet one. Includes the reason-field guide (amentionedrow is a person waiting), and two habits this app paid for: close an issue in the release that fixes it, and verify against the live published file rather than the working tree. - The dock skill documents the two-installs split: the developer container copy and the dock-installed copy in the user workspace do not share settings, timing or localStorage, so user-facing state must be checked on the instance the dock runs.
- Closed issue #1 (deprecated install refs, open since 7 July): the dead
wiki-ufypy5dpx93o.adom.cloudhost andadompkgreferences were removed earlier today, including the hardcoded fetch URL in install.rs that had been silently forcing every skill install onto its bundled fallback.
1.3.3 (2026-08-24)
Send to AI: 120s budget, delivery proven by delivered_to, honest recovery
- Client timeout raised from 45s to 120s. The tab CREATE alone can take 60s on a loaded workbench, so 45s reported failure on exactly the slow path this feature has to survive.
- Success now requires
delivered_toin the response, never the thread's name: the composite deterministically adopts an idle empty Claude tab when one exists, and a staged name can lag or miss on an adopted tab. - On an unconfirmed send the app never retries blind (that duplicates the thread). It surfaces the panel's own
_hintstext verbatim, which is written to say what happened and how to recover, and still copies the phrase.
1.3.2 (2026-08-24)
Send to AI un-parked with the correct one-call contract; no layout cap
- Send to AI works again. The park is lifted (the shell crash family was certified dead in Hydrogen 1.0.142) and the send is now ONE call: POST /ai-threads/run-prompt with new:true, submit:true, and the staged name and tags. The previous open-then-target flow could never deliver, because /ai-threads/new returns no thread id (a thread has no sid until its first submitted prompt), so every send opened an empty tab. Client timeout is 45s, because opening a tab honestly takes 10 to 30 seconds on a busy workbench and a short timeout turns a working send into a phantom failure.
- The send is gated on the shell's RELEASE version (>= 1.0.142) read from /updater/status, never on /buildinfo's build_sha, which lies on incremental builds. On an older shell it refuses honestly and copies the phrase instead; the failure path everywhere else is unchanged (error toast plus copy).
- No hardcoded layout width. A dashboard is an app surface, not an article: the page fills whatever it is given, so a maximised browser gets wider vendor columns (810px each at 2500px) instead of a dead band of background. Reading measures are capped on the prose blocks themselves.
- The page's content region owns its padding, so the gap under the header is exactly 20px whether the prompts panel is open or closed.
- Fixed: the prompts panel's X had a leftover listener from 1.1.x firing alongside the new one, so a single click folded the panel AND silently removed it entirely, with two toasts. One click, one toast, and the panel folds as intended.
1.3.1 (2026-08-24)
Emergency park of Send to AI (fleet ruling)
- /api/say-send answers {ok:false, parked:true} without calling the workspace control API: the success path crashed the ah dev shell during another app's cold verify, so the whole fleet is parked until the main ah thread certifies the fix. The two-button UI stays; Send lands on the copy fallback with an honest toast, and the un-park is a one-line backend flip.
1.3.0 (2026-08-24)
Dock Bar dashboard contract (adom-ui-design 1.9.x): header grammar, Say it with Send to AI, status pills, demo captions, newbie graduation
- Header per dash-header: outline settings cog, a ? button that recalls the folded helpers for a session, a
target: <Box>chip with a connection dot, and no version or health in the bar (version lives in the brand popover; health moved to the pill row). - Say strip per say-strip: heading "Say it", curly-quoted phrases, and two buttons on every phrase: Copy (fleet toast) and Send to AI, which opens a NEW AI thread through the panel's AI-threads API via POST /api/say-send and submits the phrase (new threads only; resume stays parked). On any failure the phrase is copied and an error toast says why.
- Status per status-leds: one compact LED pill row under the say strip (Mouser, DigiKey, JLCPCB, Search), prose on tap with the red-carries-its-next-step rule, busy escalating to "stuck?" past 15 minutes. The page footer is gone.
- Demo per dash-demo: entry moved beside the say strip ("Play the 2-minute demo"), a mute button with a remembered choice, per-step minimum durations, the toolbar bottom-center, and one ab caption per step painted on the desktop at the bridge default size, cleared on exit and on every error path.
- Newbie graduation: the strip's X folds it to a one-line reminder, three green visits fold the example chips, five (or one AI-driven search, or the X) fold the strip, and the header ? restores everything for a session. Stored in localStorage; the Settings toggle still removes the strip entirely.
- The workspace control URL is read from ~/.adom/hydrogen-control-url when present (mirrored-networking default otherwise), so Send to AI lights up the moment ah provides it in cloud workspaces.
1.2.0 (2026-08-24)
Narrated guided demo with a transport floaty
- A play button in the header (and
adom-parts-search demo) runs an eight-step guided tour: Say it strip, a live search, the vendor columns, the best-source banner, Settings, and the health lights. A draggable floaty carries play/pause, next, previous, and exit (Space, arrows, and Escape work too), a spotlight ring tracks each step, and steps auto-advance when their narration ends. - The narration is pre-rendered at build time with adom-tts (house voice, Adom pronunciations) and shipped inside the binary as eight mp3 clips served same-origin; nothing is synthesized at runtime.
- The demo's single search rides the normal quota guard; Settings opens non-modally during its step so the transport stays clickable, and exiting puts everything back (strip visibility, dialog, audio).
1.1.3 (2026-08-23)
Fleet-standard scrollbars
- Adopted the fleet scrollbar block from the adom-ui-design scrollbars sub-skill (10px, translucent pill on a transparent track, teal at 55% on hover, transparent corner, Firefox thin on every element) so every scrolling surface matches the wiki and the other dashboards. The settings modal keeps its scroll on the inner body, with the track inset past the corner radius.
1.1.2 (2026-08-23)
Try it buttons return as copy-to-clipboard with a confirming toast
- Try it sits next to each Say it phrase again; clicking it copies the phrase (clipboard API with a textarea fallback) and shows a success toast: "Copied to clipboard. Paste it into any AI thread." No AI-thread call is made from the page or the server; the staging code stays dormant until the platform re-enables it.
1.1.1 (2026-08-23)
Quota guard, copy-only Say it phrases, neutral best-source language
- An identical search repeated within 5 minutes is answered from the app's own cache instead of hitting the vendor backends, so a polling AI or a retry loop can never drain the shared daily API quota. The skill now states the rule: one search per question, never a loop.
- Say it phrases are copy-to-clipboard only for now (the stage-into-AI-thread mechanism is parked platform-side); the Try it buttons are gone.
- Recommendation and policy copy now says "preferred vendor, fastest, lowest-cost fulfillment" everywhere; delivery-mechanism specifics removed from every user-facing surface.
- README gained a Dock Bar section with a real capture of the dock-launched page in ah.
1.1.0 (2026-08-23)
Dock Bar ready page with a settings modal, Say it strip, bundled brand fonts, taskbar progress, and AI drive verbs
- New 44px three-zone header (brand, subject, actions) with the settings cog and a live vendor health LED.
- Say it strip at the top of the page: copy a phrase, or Try it to stage it into the app's own AI thread.
- Settings modal per the settings-layout skill: results per vendor, vendor toggles, recommendation policy (Mouser preferred or cheapest in stock), product photos, taskbar progress, two-click Restore defaults. Stored in ~/.adom/parts-search-settings.json;
settings get|set|restoreon the CLI. serve --print-url: self-backgrounding, idempotent, version-aware; takes over the dock webview (ADOM_DOCK_WEBVIEW)./api/status(cached, per-facet LEDs, owned rollup) with CORS and OPTIONS on every /api/* route;healthandstatusverbs.- Taskbar progress on the Hydrogen button while a search runs (determinate from measured durations; indeterminate for AI-driven
show). ui toast,ui click,ui searchdrive verbs; toasts bottom center; body-appended tooltips clamped to the viewport.- Brand fonts bundled and served same-origin (adom.inc serves no CORS header, so the remote @font-face never loaded).
- dockbar.json 1.2.0 at the page root; favicon docs/icon.svg.
- Requests are handled on threads, so a long vendor search never blocks the health probe or the state poll.
- Say it strip can be closed for good (X,
showSayStripsetting, Undo on the toast) and restored from Settings. - New companion skill
adom-parts-search-dock;installnow fetches skills from the live wiki raw-file API instead of the dead slug host. - Fixed:
showprinted "-" for every unit price.
1.0.13 (2026-08-18)
publish.sh portability and owner fixes
# Changelog
## 2.0.4 (2026-08-25)
Module 2.4.0: the panel gutter check now measures against the containing block
- Re-vendored newbie-panel.js at 2.4.0 (107620 bytes, sha256 7e01711c...e604). The new conformance row measures the panel against ITS OWN CONTAINER rather than documentElement, which this app raised: the old yardstick assumed the page scrolls, so it failed any dashboard built on the app-shell pattern (fixed shell, 44px header, scroller on an inner element) by exactly one scrollbar width, while passing pages that happen to scroll at document level. Nothing in this app changed: the structure, the inner scroller and the 16px gutter all stay, and the 702px panel inside a 734px container is correct under the corrected check.
## 2.0.3 (2026-08-25)
Module upgraded to adom-ui-design 2.1.1
- Re-vendored assets/module/newbie-panel.js from a clean 2.1.1 install (105713 bytes, sha256 1df6d7cd...e73c). Picks up three upstream changes: selfCheck now accepts both the used and the declared border width (it would have failed a correct panel on surfaces reporting the declared value), onToggle carries a source argument so an app cannot feed its own open/close calls back into its graduation policy, and the header toggle tooltip swaps with state.
## 2.0.2 (2026-08-25)
Fix the dead listener that stopped the page script and left no panel
- 2.0.0 and 2.0.1 rendered NO prompts panel on John machine. Root cause was mine: deleting the hand-rolled panel left three references to elements that no longer exist, and \$('#btnDemo').addEventListener threw an uncaught TypeError at the top level of the script, which halted everything after it, including the line that schedules the state poll. No poll meant no phrases, and no phrases meant no mount, so the symptom (module loaded, panel absent) looked like a module problem and was not.
- Removed the dead listener, the graduation calls the module now owns, and repointed the say-close drive id at the header toggle. Added an id audit: every id referenced from JS is now checked against the markup at build time in the release checklist.
- Diagnosis note for the build skill: the page posts its console to the instance that SERVED it, so reading /console in the developer container shows nothing about the user's dashboard. Read the page own console through the webview instead.
## 2.0.1 (2026-08-25)
The panel mount now retries, and its failures are visible
- 2.0.0 could leave the dashboard with NO prompts panel: renderSay committed the phrase list BEFORE mounting, so if the mount threw or the module was not ready on the first poll, every later poll short-circuited on the equality check and never tried again. pollState wraps its body in a bare catch, so the reason was swallowed silently. Measured live in John ah: module loaded, phrases served, panel absent.
- The mount is now attempted until it succeeds, the phrase list is committed only after a successful mount, and any failure is logged to the console (and therefore to GET /console) instead of vanishing.
## 2.0.0 (2026-08-25)
The prompts panel is now the SHARED MODULE, not ours
- Mounts adom-ui-design 2.0.0 assets/module/newbie-panel.js, vendored verbatim and served next to the dashboard. The module owns the card, the two-column grid and its collapse (a container query on the panel box, not a viewport width), the table, the 40px row, both icons in one aligned 72px column, the clipboard path, the send path with its version gate and three-state verification, the toasts, the tooltips, the X, the header toggle and the open/closed memory. This app now owns only its phrases, its noun, and what the demo button does.
- DELETED the hand-rolled panel: all 12 remaining .say* rules (pill era and panel era), the markup, and the state machine. Leaving them beside the module is how the teal demo button was lost to source order twice.
- Added two same-origin proxy routes, /updater/status and /ai-threads/run-prompt, so the module gates and sends through this server rather than reaching across origins from the page.
- Major bump because the panel implementation changed hands: same contract, different owner.
## 1.4.6 (2026-08-25)
Prompt phrases lead with the noun and fit the cell
- Measured in John ah: two of six phrases truncated at his resting 744px pane, and because the trigger noun trailed every phrase, the ellipsis ate "parts search" itself, which is the one thing the panel exists to teach. All six phrases now LEAD with "with parts search," so a clip costs a detail rather than the routing words, and all six are shortened to clear the ~336px clipping span with margin.
- The build skill gains the authoring rule and the probe method: measure the rendered width with an off-DOM probe span against the clipping SPAN, never the cell, which carries the overflow property and always reads as fitting.
## 1.4.5 (2026-08-25)
The 1.4.3 demo-button fix was itself broken
- 1.4.3 claimed to scope the demo button rule to .say .demo-btn so it would beat the shared .btn background. The edit double-prefixed it into ".say .say .demo-btn", a selector that requires a .say inside a .say and therefore never matches any element, so the rule was dead and .btn kept painting the button surface. Measured in John ah on 1.4.4: rgb(28,33,40) where teal belongs. Collapsed to a single .say prefix and removed a duplicated :active rule.
## 1.4.4 (2026-08-25)
Panel collapse moves to the current fleet number, 700px
- The published breakpoint moved 620px to 700px in adom-ui-design 1.34.0 after another app measured that two columns at the narrow state truncated the qualifier the prompts exist to teach. This app was one version stale at 620.
- What it means on John machine: with the dock rail CLOSED his pane is 744px, above 700, so the panel stays two columns while he reads. With the rail OPEN it is 632px, below 700, so the panel drops to one column while he is launching something and looking at the rail rather than the prompts. Both rail states are now in the test matrix.
## 1.4.3 (2026-08-25)
Panel heading spans the panel; the demo button is filled again
- The "Say it" heading and its explainer now span the full panel above both columns (grid-template-areas), instead of sitting inside the prompts column. Found in a live measurement of John ah by the dock thread.
- The demo button is the panel ONLY filled button again. It was rendering as a ghost because .demo-btn and .btn are both single-class selectors and .btn is declared later in the sheet, so its surface background silently won on source order; the rule is now scoped to .say .demo-btn.
- Fixed malformed panel markup: a stray closing div ended the heading early, which dropped the right column entirely and left the prompts table as a bare grid child. The section is balanced now (4 open, 4 close).
## 1.4.2 (2026-08-25)
The panel left column actually shrinks at the narrow end
- `minmax(180px, 220px)` never reached 180: a minmax track resolves to its MAX whenever the neighbouring 1fr track can shrink, and this panel sets min-width:0 on those tracks, so the left column was pinned at 220px at every width including 620px, where the phrase column needs the space most. It is now clamp(180px, 30%, 220px), which resolves against the container: 180px at 620px, about 200px at John's 744px dock pane, and the full 220px from 853px up.
## 1.4.1 (2026-08-25)
Panel collapses at 620px, not 720px
- The two-column panel now collapses at 620px (adom-ui-design 1.25.0), and the left column is minmax(180px, 220px) rather than a hard 220px. The dock pane band is roughly 744px to 853px, so any collapse above 620 risks hiding the two-column layout in the exact pane it was designed for while every structural check still passes. 744px is now in the test matrix; the general lesson is that a breakpoint bug is invisible to anyone whose test widths straddle it (1280 and 390 both miss 744).
## 1.4.0 (2026-08-25)
The full 1.22.1 visual contract, in-page demo captions, and two launch-path fixes
- The newbie panel is now the contract shape: ONE full-width band, a sibling of the app body, in two columns (220px and the rest, 24px gap, hairline between) with the demo button alone on the left as the panel's only filled button.
- Prompts are a TABLE, not pills: 40px rows with hairline dividers, the phrase truncating with an ellipsis, and a fixed 72px action cell that tracks the phrase rather than the window edge, so the actions never strand 2000px from their text on a wide monitor.
- Copy and Send are the pack's shipped action-copy.svg and action-send.svg at 16px in 28x28 ghosts, muted at rest and teal on hover, each with a 44px touch target, a tooltip, a matching aria-label, and a toast.
- The panel X now FULLY closes the panel: the folded one-liner is gone and the app content moves up. The header ? still toggles the same state.
- Header: 16px padding inside the 44px edge-to-edge bar, the app mark is now literally the same favicon.svg file the dock uses, the name is 600/15 in --text rather than teal, and the cog is the pack's settings-cog-outline.svg.
- Demo captions render IN-PAGE instead of on the desktop (adom-ui-design 1.24.0: captions belong on the surface the demo drives, and this demo drives this page). No desktop_caption calls remain.
- LED short states are emitted by the SERVER and rendered verbatim; the page no longer truncates prose, which is what produced "in talled and pinned" on another dashboard.
- Launch path: the install step no longer uses skip_if command -v, which skipped the install whenever ANY version existed and so never delivered fixes to a user who already had the app. It is install-or-update now. The dashboard HTML is served no-store, must-revalidate so an updated app cannot serve a stale page, and serve self-backgrounds with setsid and only retires a process that genuinely answers as this app on that port.
## 1.3.5 (2026-08-24)
The header ? is a real toggle, and the prompts panel reads properly on a phone
- FIXED (John, in his ah): the header ? did not toggle the prompts panel. It only ever restored it, and it wrote a session-only "recall" flag while the panel X wrote a separate graduation flag, so the two controls drove different state and could drift: pressing ? after an X did not undo the X, and neither choice survived a reload.
- The ?, the panel X, and the Settings toggle now drive ONE persisted value, so they cannot disagree. Press ? to close, press again to open, and the choice survives a reload. The ? reports state two ways per input-feedback (aria-pressed plus a teal glyph on an inset background), and its label and tooltip swap between Hide and Show the prompts panel.
- localStorage keys are namespaced with the app slug now (the origin does not isolate apps), migrating the old un-namespaced graduation state on first load.
- Phone width: prompt chips become full-width rows, so a phrase no longer wraps inside a pill, Send to AI no longer breaks across two lines, and the curly quotes hug their words instead of orphaning at the row edges. Found by LOOKING at the 390px frame; the measurements alone all passed.
## 1.3.4 (2026-08-24)
Skill updates: check the wiki inbox, and verify on the instance the dock runs
- The build skill now opens with the inbox rule: `adom-wiki inbox` is the only place issue comments, closures and @mentions surface, nothing pushes them, and an unread inbox looks exactly like a quiet one. Includes the reason-field guide (a `mentioned` row is a person waiting), and two habits this app paid for: close an issue in the release that fixes it, and verify against the live published file rather than the working tree.
- The dock skill documents the two-installs split: the developer container copy and the dock-installed copy in the user workspace do not share settings, timing or localStorage, so user-facing state must be checked on the instance the dock runs.
- Closed issue #1 (deprecated install refs, open since 7 July): the dead `wiki-ufypy5dpx93o.adom.cloud` host and `adompkg` references were removed earlier today, including the hardcoded fetch URL in install.rs that had been silently forcing every skill install onto its bundled fallback.
## 1.3.3 (2026-08-24)
Send to AI: 120s budget, delivery proven by delivered_to, honest recovery
- Client timeout raised from 45s to 120s. The tab CREATE alone can take 60s on a loaded workbench, so 45s reported failure on exactly the slow path this feature has to survive.
- Success now requires `delivered_to` in the response, never the thread's name: the composite deterministically adopts an idle empty Claude tab when one exists, and a staged name can lag or miss on an adopted tab.
- On an unconfirmed send the app never retries blind (that duplicates the thread). It surfaces the panel's own `_hints` text verbatim, which is written to say what happened and how to recover, and still copies the phrase.
## 1.3.2 (2026-08-24)
Send to AI un-parked with the correct one-call contract; no layout cap
- Send to AI works again. The park is lifted (the shell crash family was certified dead in Hydrogen 1.0.142) and the send is now ONE call: POST /ai-threads/run-prompt with new:true, submit:true, and the staged name and tags. The previous open-then-target flow could never deliver, because /ai-threads/new returns no thread id (a thread has no sid until its first submitted prompt), so every send opened an empty tab. Client timeout is 45s, because opening a tab honestly takes 10 to 30 seconds on a busy workbench and a short timeout turns a working send into a phantom failure.
- The send is gated on the shell's RELEASE version (>= 1.0.142) read from /updater/status, never on /buildinfo's build_sha, which lies on incremental builds. On an older shell it refuses honestly and copies the phrase instead; the failure path everywhere else is unchanged (error toast plus copy).
- No hardcoded layout width. A dashboard is an app surface, not an article: the page fills whatever it is given, so a maximised browser gets wider vendor columns (810px each at 2500px) instead of a dead band of background. Reading measures are capped on the prose blocks themselves.
- The page's content region owns its padding, so the gap under the header is exactly 20px whether the prompts panel is open or closed.
- Fixed: the prompts panel's X had a leftover listener from 1.1.x firing alongside the new one, so a single click folded the panel AND silently removed it entirely, with two toasts. One click, one toast, and the panel folds as intended.
## 1.3.1 (2026-08-24)
Emergency park of Send to AI (fleet ruling)
- /api/say-send answers {ok:false, parked:true} without calling the workspace control API: the success path crashed the ah dev shell during another app's cold verify, so the whole fleet is parked until the main ah thread certifies the fix. The two-button UI stays; Send lands on the copy fallback with an honest toast, and the un-park is a one-line backend flip.
## 1.3.0 (2026-08-24)
Dock Bar dashboard contract (adom-ui-design 1.9.x): header grammar, Say it with Send to AI, status pills, demo captions, newbie graduation
- Header per dash-header: outline settings cog, a ? button that recalls the folded helpers for a session, a `target: <Box>` chip with a connection dot, and no version or health in the bar (version lives in the brand popover; health moved to the pill row).
- Say strip per say-strip: heading "Say it", curly-quoted phrases, and two buttons on every phrase: Copy (fleet toast) and Send to AI, which opens a NEW AI thread through the panel's AI-threads API via POST /api/say-send and submits the phrase (new threads only; resume stays parked). On any failure the phrase is copied and an error toast says why.
- Status per status-leds: one compact LED pill row under the say strip (Mouser, DigiKey, JLCPCB, Search), prose on tap with the red-carries-its-next-step rule, busy escalating to "stuck?" past 15 minutes. The page footer is gone.
- Demo per dash-demo: entry moved beside the say strip ("Play the 2-minute demo"), a mute button with a remembered choice, per-step minimum durations, the toolbar bottom-center, and one ab caption per step painted on the desktop at the bridge default size, cleared on exit and on every error path.
- Newbie graduation: the strip's X folds it to a one-line reminder, three green visits fold the example chips, five (or one AI-driven search, or the X) fold the strip, and the header ? restores everything for a session. Stored in localStorage; the Settings toggle still removes the strip entirely.
- The workspace control URL is read from ~/.adom/hydrogen-control-url when present (mirrored-networking default otherwise), so Send to AI lights up the moment ah provides it in cloud workspaces.
## 1.2.0 (2026-08-24)
Narrated guided demo with a transport floaty
- A play button in the header (and `adom-parts-search demo`) runs an eight-step guided tour: Say it strip, a live search, the vendor columns, the best-source banner, Settings, and the health lights. A draggable floaty carries play/pause, next, previous, and exit (Space, arrows, and Escape work too), a spotlight ring tracks each step, and steps auto-advance when their narration ends.
- The narration is pre-rendered at build time with adom-tts (house voice, Adom pronunciations) and shipped inside the binary as eight mp3 clips served same-origin; nothing is synthesized at runtime.
- The demo's single search rides the normal quota guard; Settings opens non-modally during its step so the transport stays clickable, and exiting puts everything back (strip visibility, dialog, audio).
## 1.1.3 (2026-08-23)
Fleet-standard scrollbars
- Adopted the fleet scrollbar block from the adom-ui-design scrollbars sub-skill (10px, translucent pill on a transparent track, teal at 55% on hover, transparent corner, Firefox thin on every element) so every scrolling surface matches the wiki and the other dashboards. The settings modal keeps its scroll on the inner body, with the track inset past the corner radius.
## 1.1.2 (2026-08-23)
Try it buttons return as copy-to-clipboard with a confirming toast
- Try it sits next to each Say it phrase again; clicking it copies the phrase (clipboard API with a textarea fallback) and shows a success toast: "Copied to clipboard. Paste it into any AI thread." No AI-thread call is made from the page or the server; the staging code stays dormant until the platform re-enables it.
## 1.1.1 (2026-08-23)
Quota guard, copy-only Say it phrases, neutral best-source language
- An identical search repeated within 5 minutes is answered from the app's own cache instead of hitting the vendor backends, so a polling AI or a retry loop can never drain the shared daily API quota. The skill now states the rule: one search per question, never a loop.
- Say it phrases are copy-to-clipboard only for now (the stage-into-AI-thread mechanism is parked platform-side); the Try it buttons are gone.
- Recommendation and policy copy now says "preferred vendor, fastest, lowest-cost fulfillment" everywhere; delivery-mechanism specifics removed from every user-facing surface.
- README gained a Dock Bar section with a real capture of the dock-launched page in ah.
## 1.1.0 (2026-08-23)
Dock Bar ready page with a settings modal, Say it strip, bundled brand fonts, taskbar progress, and AI drive verbs
- New 44px three-zone header (brand, subject, actions) with the settings cog and a live vendor health LED.
- Say it strip at the top of the page: copy a phrase, or Try it to stage it into the app's own AI thread.
- Settings modal per the settings-layout skill: results per vendor, vendor toggles, recommendation policy (Mouser preferred or cheapest in stock), product photos, taskbar progress, two-click Restore defaults. Stored in ~/.adom/parts-search-settings.json; `settings get|set|restore` on the CLI.
- `serve --print-url`: self-backgrounding, idempotent, version-aware; takes over the dock webview (ADOM_DOCK_WEBVIEW).
- `/api/status` (cached, per-facet LEDs, owned rollup) with CORS and OPTIONS on every /api/* route; `health` and `status` verbs.
- Taskbar progress on the Hydrogen button while a search runs (determinate from measured durations; indeterminate for AI-driven `show`).
- `ui toast`, `ui click`, `ui search` drive verbs; toasts bottom center; body-appended tooltips clamped to the viewport.
- Brand fonts bundled and served same-origin (adom.inc serves no CORS header, so the remote @font-face never loaded).
- dockbar.json 1.2.0 at the page root; favicon docs/icon.svg.
- Requests are handled on threads, so a long vendor search never blocks the health probe or the state poll.
- Say it strip can be closed for good (X, `showSayStrip` setting, Undo on the toast) and restored from Settings.
- New companion skill `adom-parts-search-dock`; `install` now fetches skills from the live wiki raw-file API instead of the dead slug host.
- Fixed: `show` printed "-" for every unit price.
## 1.0.13 (2026-08-18)
publish.sh portability and owner fixes