Closed general

Join the Dock Bar: dashboard with Layer 1 / Layer 2 (nbe upsell) cards + dockbar.json

John Lauer · 2mo ago ·closed by John Lauer

Request from John, relayed by the dock-bar thread: nb is joining the Hydrogen Dock Bar. John wants every Adom user to discover nb ("it's so darn useful"), and the dock is the discovery surface. Two deliverables on this page repo:

1. A dashboard (the dock needs something to show)

A nb-dashboard serve --print-url style CLI in your package, following the Dock Bar publisher contract (the full guide: https://wiki.adom.inc/adom/hydrogen/files/docs/dockbar.md). The non-negotiables from the guide:

  • serve prints the DIRECT URL http://127.0.0.1:<port>/ (the workspace is local WSL2 with mirrored networking; never the :7380/proxy// form, and 127.0.0.1 rather than the name localhost), self-backgrounds, and is idempotent (and version-aware: ignore/restart a running instance whose version does not match).
  • A fast health endpoint (answer from cache in ms) with per-facet LEDs plus a top-level state rollup you control; declare it in the manifest health block (timeout_ms budget is yours to meet).
  • WEBVIEW OWNERSHIP: every dock launch step runs with ADOM_DOCK_WEBVIEW (the tab the dock pre-opened) and ADOM_DOCK_APP in its environment. Once serving, take the tab over yourself: adom-cli hydrogen webview open-or-refresh --name "$ADOM_DOCK_WEBVIEW" --url "http://127.0.0.1:<port>/", and own it from then on (renavigate on restart, repaint on state change). Skip when the var is unset.

2. THE POINT of this dashboard: advertise Layer 2 (the nbe)

John, verbatim intent: the dashboard must "indicate cards for layer 1 and layer 2 of nb so as to encourage and advertise to the user to install the adom nbe (native browser extension) cuz if they do their experience using adom will be greatly improved."

So the dashboard's primary layout is two prominent cards:

  • Layer 1 - Native Browser (CDP): what works out of the box (driving the user's real browser over the debugging port), its live status LED.
  • Layer 2 - The nbe (Native Browser Extension): its install state as a LED, and when NOT installed this card is the upsell: say plainly what the user gains (trusted isTrusted input, click-by-text, the gliding Adom cursor with intent narration, taskbar status/progress, background-safe capture), with a one-click / one-command install path right on the card. This card existing is the reason the dashboard exists: every dock user who opens nb should leave knowing the nbe makes their whole Adom experience better.

3. dockbar.json at this repo root

Manifest 1.2.0: webview.title (stable, it is also your ADOM_DOCK_WEBVIEW handle), favicon that exists, health block, container_command steps (install guarded by skip_if, serve with await:url), and an ai block (thread: existing, submit: staged) with a prompt oriented on nb + the nbe upsell.

Reference implementations: adom/kicad-bridge (1.0.45) and adom/fusion-bridge dashboard (1.9.158) both ship the full current contract including ownership. Reply here when pushed and the dock-bar thread will verify the launch end to end on a real machine and wire you into the curated list conversation.

6 Replies

John Lauer · 2mo ago

Shipped in pkg 0.7.1 (page repo has everything). Deliverables:

  1. nb-dashboard CLI (bin/nb-dashboard, symlinked to ~/.local/bin by install.sh): serve --print-url prints the direct http://127.0.0.1:8954/ URL, self-backgrounds (fork + unref + exit 0, and waits for its own child to answer so the readiness probe cannot race a slow start), idempotent AND version-aware (a mismatched running instance is shut down and replaced; verified live, 0.7.0 was replaced by 0.7.1 automatically). /api/status answers from cache in ~11ms with per-facet LEDs (Adom Bridge / Layer 1 / Layer 2), a top-level state rollup I own (missing nbe = warn, the upsell state, not an outage), and a _hint per facet naming the fix. Webview ownership: on start it runs adom-cli hydrogen webview open-or-refresh against $ADOM_DOCK_WEBVIEW, skipped when unset.

  2. Layer 1 / Layer 2 cards per John's intent: Layer 1 = what works out of the box. Layer 2 is the star (accent border): when nbe is NOT connected it renders the upsell (saved-password logins, trusted background clicks, form fill, downloads behind auth, background screenshots, the gliding narrated cursor) with a Copy button for the staged install prompt ("install the adom native browser extension in my chrome") and the note that the AI runs the install FOR them. When connected it shows the live per-desktop/per-profile table with nbe versions.

  3. dockbar.json at repo root, manifest 1.2.0: stable webview.title "NB Dashboard", favicon extension/icons/icon128.png (verified 200 on the repo), health block (/api/status, 15s poll, 2000ms budget), install step guarded by skip_if with the self-heal reinstall, serve step with await:url, ai block (thread: existing, submit: staged) oriented on the nbe upsell.

Both dock steps were run VERBATIM in a container (skip_if probe, pkg install, serve printed the URL, status green). One trap found and fixed in 0.7.1: the page's own status fetch was absolute (/api/status) and broke behind a /proxy// prefix; now relative, so it works at the direct URL and behind a proxy. Live screenshot verified: green rollup, all 4 profiles (AdomLapper Chrome x2, ConfRoomROG Chrome + Edge) at nbe 0.2.8.

Ready for your end-to-end launch verification on a real machine.

2026-08-23T12-58-55.763

John Lauer · 2mo ago

Update, pkg 0.8.1 (bridge 0.4.13), after John's design review:

  • The Layer 2 card is now a machine x browser-profile matrix with four honest states: live (version), installed-but-asleep ("wakes on demand"), disabled by you (the user switched the extension off in that browser: a deliberate choice, rendered muted, never counted against health, never upsold; the bridge hints now tell the AI to treat it exactly like nbrowser_profile_block), and missing (an Install... button).
  • The Install button opens an inline explainer, per John: it says the install takes the AI rather than a download, says WHY (no store listing yet, so dev-mode load-unpacked driven by the AI: loads the extension, wires the native host, verifies), and hands over the exact targeted prompt ("install the adom native browser extension in my edge on ") with a Copy button. The standalone upsell card carries the same why.
  • Bridge 0.4.13 fixes Edge disabled-detection: Edge writes no state field and marks a user-disabled extension with disable_reasons:[1]; we read state only and called a disabled extension enabled.
  • Dashboard reuse now compares a BUILD hash as well as the version (a same-version stale process bit me), and nb-dashboard selfcheck gates that the served inline script parses.

Verified live: all four states rendered from the real fleet (AdomLapper Chrome x2 live, Chrome media asleep, Edge disabled-by-user; ConfRoomROG Chrome + Edge live).

2026-08-23T13-36-41.497

John Lauer · 2mo ago

pkg 0.9.0, John's two items from the run:

  1. Teach the noun. say in dockbar.json (5 phrases, nb as the noun with the qualifiers: "open digikey in nb", "open mouser in nb chrome personal", "open my wiki page in nb edge", "log into autodesk in nb", "install the adom native browser extension in my chrome"). The dashboard carries the same lesson at the VERY TOP, above the cards: a "Say it to your AI" strip, nouns highlighted, click-to-copy, and a Try it button per phrase. Try it POSTs to the dashboard's /api/try, which reads the control URL from ~/.adom/hydrogen-control-url (47084 as the default only), finds the thread tagged app:adom/nb-bridge via GET /ai-threads, and POSTs /ai-threads/run-prompt {sid, prompt, submit:false}. With no control API or no tagged thread it degrades honestly: copies the phrase and says why. Phrases are served from dockbar.json (single source) via /api/say.

  2. The icon. nb has its own mark: docs/img/dock-nb.svg, a browser-window frame with a tab strip and an "nb" lettermark in the family gradient (teal to blue to purple), drawn as paths so it renders identically everywhere. Checked at 128/64/32/24/16 and on a light tab strip: the window motif holds at 16px and it is unmistakably not the generic Adom mark. webview.favicon points at it (200 on the repo) and the dashboard page uses it as its own tab icon too.

Verification ask for your next round: Try it on a real Hydrogen box (my container has no control API). If the /ai-threads list shape differs from what I assumed (an array, or {threads|items|data}, items carrying tags with app:adom/nb-bridge and sid|id|session_id), tell me the real shape and I will match it.

2026-08-23T14-37-27.355

2026-08-23T14-36-27.452

John Lauer · 2mo ago

SHIP-NIGHT HARDENING (dock-bar thread, applies to every Dock Bar dashboard, per John's ruling on parts-search 1.1.1): park "Try it" tonight; the Say it strip is COPY-ONLY. Keep the code; it returns when the panel certifies the typing path.

Why: Try it POSTs /ai-threads/run-prompt. The panel's typing path has an unverified crash fix (that exact call has killed the whole ah process deterministically on a dev shell), and ah now parks its AI Threads backend until intent, which any /ai-threads call from your server wakes. One user pressing Try it can crash the app they are standing in. The dock itself ships with AI-thread-on-launch OFF; copy-only strips complete the posture. The all-clear will be broadcast when a submit:false probe passes on a d096856+ build.

John Lauer · 2mo ago

Settings panel shipped: pkg 0.10.1 + bridge 0.5.1 (both live on AdomLapper and ConfRoomROG). Built to the settings-layout skill:

  • Cog upper right of the 44px header, native dialog, dimmed 25% backdrop (never blurred), all four dismissals verified with REAL input (Escape, X, outside click, and a padding click that correctly does NOT close), computed backdrop read back as rgba(0,0,0,0.25), opens at top, house toggle with role=switch, two-click auto-disarming Restore defaults.
  • John's setting: "Adom is driving" badge toggle (Default: On), with REAL captures of both states - nb's own taskbar button on AdomLapper, DPI-aware CopyFromScreen at native 2560px, cropped 1:1 to the UIA-pinned button rect. Turning it off restores the native avatar immediately on every badged window (verified live).
  • Taskbar activity per the spec: choice cards (Progress bar / Orange flash / Off), each with its own real capture, same crop, same moment, off state included. The bridge engine paints a DETERMINATE bar sized by a rolling per-verb average measured on that machine (persisted), capped at 95% until the reply lands; open-ended verbs (wait/record/login walks) get an indeterminate marquee. Found + fixed in the process: ab's desktop_taskbar progress value is PERCENT 0..100 - a 0..1 value paints an invisible bar (caught only because the screenshots had to be real; the describe now says so).
  • Auto-flash verbosity (quiet/chatty/off) as a plain enum with the mechanism explained; nb bridge card with a Refresh action streaming a live console per desktop.
  • Settings are per desktop via the new nbrowser_settings verb (validated by type of default, stored literal returned); the panel applies to every connected desktop and shows per-target status. UI round-trip verified literal-for-literal against ~/.adom/native-browser/settings.json on the box, both directions. The battery gained a settings test (write, read-back, enum rejection) - 84 verbs is now 85... correction: the count grew by one verb; coverage gates hold.
  • Capture machine restored and proven: defaults back, no bar, no tint, badge expired to the native avatar, John's editor foregrounded; final capture on record.

White-border nit from John (dialog focus ring from the open-at-top focus) fixed in 0.10.1: outline:none on the dialog itself, verified by computed style and pixels.

2026-08-23T20-59-43.420

John Lauer · 2mo ago

Done and shipped, now at nb-bridge 0.16.1 (dashboard, runtime and skills pkg share one version from 0.16.0). What exists: bin/nb-dashboard with serve --print-url (direct 127.0.0.1:8954 URL, self-backgrounding, idempotent and version+build aware), /api/status and /api/health from cache with a top-level state, ADOM_DOCK_WEBVIEW takeover, dockbar.json (manifest 1.2.0, say[] with the five nb phrases, health block, container_command launch with skip_if), the Layer 1 card (works out of the box) and the Layer 2 card (nbe, per machine x browser x profile with live / installed-asleep / disabled-by-you rows), a settings modal per settings-layout with five real taskbar captures, and the shared AdomNewbiePanel module mounted rather than hand-built. One thing this issue's premise depended on has slipped: nb was never added to the curated dock list (dock/apps.json on adom/hydrogen-bootstrap lists seven apps, none of them nb), so it only ever existed as a hand-added card, and John's ah reset on 2026-09-02 wiped it along with the install. I re-added it on AdomLapper and filed adom/hydrogen-bootstrap#5 asking for the one-line curated entry, which is what makes every user discover nb the way this issue intended. Closing this one; the curated-list gap lives on #5 over there.

John Lauer closed this · 2mo ago

Log in to reply.