Skip to content

feat(download): real desktop cockpit and tray screenshots with provenance manifest#215

Merged
abrichr merged 1 commit into
mainfrom
feat/desktop-tray-visuals
Jul 19, 2026
Merged

feat(download): real desktop cockpit and tray screenshots with provenance manifest#215
abrichr merged 1 commit into
mainfrom
feat/desktop-tray-visuals

Conversation

@abrichr

@abrichr abrichr commented Jul 19, 2026

Copy link
Copy Markdown
Member

What

Adds a "What you're installing" section to /download with two real, unretouched captures of the Experimental desktop surfaces, each framed in the site's window-chrome convention with an honesty-first caption:

  1. Desktop cockpit — connect screen. The unmodified vite build output of openadapt-desktop v0.6.1 (commit 4912989), served locally and captured with Playwright at 2x in the app's real default window size (1120x760). No Tauri runtime or engine sidecar was attached, so the cockpit rendered its real connect (Sign in) surface through its own graceful-degradation code path. No DOM was injected or modified.
  2. Tray menu — live capture. The published openadapt-tray 0.1.1 PyPI package running in the macOS menu bar with its real menu open, captured with macOS screencapture and cropped. State shown is the true standalone state (no desktop companion, sync offline). The only deviation from stock: the pynput global-hotkey listener was not started (it hard-crashes without Input Monitoring permission in the capture session), and a neutral dark window was placed behind the menu before capture so the shot doesn't leak unrelated screen content. The menu bar, icon, and menu are unmodified.

Download section — desktop

Mobile rendering

Download section — mobile

Honesty boundaries enforced

  • Captions state Experimental prerelease, unsigned or ad-hoc-signed builds — see release notes (matches the current desktop-v0.6.1 prerelease labels; v0.5.1 named in the original ask is now marked "Superseded — do not use" upstream, so captions pin to the current interface code instead).
  • The tray is labeled with its actual version (0.1.1), as a separate pip install openadapt-tray package, explicitly not included in the installers on this page, and explicitly "no released desktop build provides the companion service it connects to yet" — the tray README's own boundary. It is never described as controlling the desktop app.
  • public/desktop-preview/MANIFEST.json records repo, commit, capture method, dimensions, and sha256 for both assets (same convention as product-preview/MANIFEST.json), and the page links to it.
  • tests/desktopPreview.test.js enforces the contract: every rendered image must have a manifest entry whose sha256 matches the bytes on disk; the honesty phrases must be present; the section must stay static (no useState/useEffect/setInterval, explicit width/height on both images → no motion-token or reduced-motion surface, no layout shift).

Landing-page decision: kept off the landing page

Judgment call per the brief: what the product honestly renders without a signed-in engine is a sign-in card and a modest tray menu. That is exactly right for /download (it sets accurate first-launch expectations next to the install buttons) but is empty-state-heavy next to the landing page's DashboardShowcase and reference-footage sections — a sign-in screen would weaken the landing narrative rather than strengthen it. The landing page was also deliberately left untouched to avoid colliding with fix/authentic-cloud-showcase-media, which is reworking the adjacent showcase on pages/index.js. If you want a strip anyway, the assets and component are reusable in one line.

What was tried and skipped (real or nothing)

  • Packaged app capture: the v0.6.1 macOS arm64 DMG was downloaded, mounted, and launched — the binary panics at startup: PluginInitialization("updater", "Error deserializing 'plugins.updater' ... invalid type: null, expected struct Config") (src-tauri/src/main.rs:77). Worth an upstream openadapt-desktop issue; the Vite capture of the same interface code stands in.
  • Authenticated cockpit states (workflow library, runner, teach): not captured — they require a real signed-in engine session, and mocking engine responses would have meant fabricated workflow data.

Gates

  • npm test: 71/71 (publicTruth untouched, new desktopPreview suite included)
  • next build: clean
  • Cypress: 30/30 across all 5 specs against the production build

🤖 Generated with Claude Code

https://claude.ai/code/session_01NyCHrzA1psrKMFfroYbzaM

…e manifest

Add a 'What you're installing' section to /download built from two real,
unretouched captures: the desktop cockpit's connect screen (unmodified
v0.6.1 vite build, no engine attached) and the published openadapt-tray
0.1.1 menu open live in the macOS menu bar in its standalone state.
Captions state the Experimental/unsigned reality, the tray's separate
packaging, and that no released desktop build provides the companion
service the tray expects. Capture provenance (repo, commit, method,
sha256) is recorded in public/desktop-preview/MANIFEST.json and enforced
by tests/desktopPreview.test.js (hash match + honesty labels + static,
no-layout-shift section).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NyCHrzA1psrKMFfroYbzaM
@netlify

netlify Bot commented Jul 19, 2026

Copy link
Copy Markdown

Deploy Preview for cosmic-klepon-3c693c ready!

Name Link
🔨 Latest commit 1006c07
🔍 Latest deploy log https://app.netlify.com/projects/cosmic-klepon-3c693c/deploys/6a5cd02e3251d700081bcfd4
😎 Deploy Preview https://deploy-preview-215--cosmic-klepon-3c693c.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@abrichr
abrichr merged commit e0df6b0 into main Jul 19, 2026
5 checks passed
abrichr added a commit that referenced this pull request Jul 19, 2026
Add authentic Windows 11 captures alongside the macOS cockpit/tray
surfaces merged in #215, from a real NSIS installer run
(OpenAdapt-Desktop-Experimental-v0.6.1-windows-x86_64-unsigned-nsis-setup.exe).

- DesktopPreview: a "Windows install flow" strip of three NSIS wizard
  stills (welcome -> choose location -> finish) in neutral Windows chrome,
  with honest captions. Explicit 1044x784 dims, static, no motion.
- download.js First launch: pair the existing unsigned-build guidance with
  the real "Open File - Security Warning" / Unknown Publisher capture so
  users see exactly what to expect. Reworded to name the actual dialog.
- Honesty: no app-window shots exist because the shipped build panics at
  launch (openadapt-desktop issue #26); the finish caption says so and no
  app window is implied. Windows tray omitted to avoid redundancy with the
  macOS tray already shown in #215.
- MANIFEST.json: source, capture method, sha256, and dims for all four new
  assets. desktopPreview.test.js extended to hash-verify every
  /desktop-preview image across DesktopPreview.js and download.js and to
  assert the required honesty phrases.


Claude-Session: https://claude.ai/code/session_01NyCHrzA1psrKMFfroYbzaM

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
abrichr added a commit that referenced this pull request Jul 20, 2026
Add a Cypress regression assertion that visits /download at 375px and
390px and asserts documentElement.scrollWidth stays within the viewport.

Investigation finding: the /download page does NOT currently scroll
horizontally at any width from 320-414px in the fully-loaded ready state
(chart + stats + install-flow + desktop preview all render and fit).
Confirmed by measuring documentElement.scrollWidth and by a full-page
mobile screenshot. Recent download-page work (#215/#216/#219/#223/#229)
appears to have already resolved any earlier overflow.

Because globals.css sets `overflow-x: hidden` on html/body, a naive
scrollWidth check would be clamped by Chrome and trivially pass, masking
future regressions — and that mask does not reliably stop horizontal
panning on iOS Safari, which is the surface this guards. The assertion
therefore neutralizes the mask first so it measures the true content
width. Verified meaningful: injecting a 900px element with the mask
neutralized makes the assertion fail as expected.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant