Skip to content

Polish desktop onboarding, page transitions, and themed capsules - #1272

Merged
appergb merged 20 commits into
betafrom
feat/desktop-guided-setup
Oct 30, 2026
Merged

appergb merged 20 commits into
betafrom
feat/desktop-guided-setup

Conversation

@appergb

@appergb appergb commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Desktop setup previously stopped at permission prompts, and navigation replaced content before the next screen was ready. Bound the optional startup credential probe to 1.5 seconds so an unresponsive credential service cannot trap the main window on the startup screen. Retain the existing rejection fallback, cancel the waiting timer with the effect, and ignore late results without marking setup complete or bypassing the backend contract handshake. Add a resumable, centered setup guide with optional configuration steps and a fixed primary action. Permissions stay on the current step after granting; users can defer setup, enter the app, and reopen the guide from Permissions. Windows uses a seven-step guide, skips macOS Accessibility probes, explains desktop-app microphone access, refreshes permission state on return, and permits deferral when no microphone is available. Its shortcut guidance matches left/right modifier and Mouse4/Mouse5 support.

Coordinate outgoing and incoming pages with blur, vertical motion and scale: normal transitions take about 250 ms, and slower initial preparation uses about 380 ms while retaining the previous page. Onboarding uses a gentler 300 ms handoff and 340 ms glyph blur reveal while retaining the normal navigation timing. All three visual properties share one native animation timeline, including interrupted returns. Respect reduced motion, release animation layers, smooth coarse wheel input, and hide scrollbar chrome while keeping native trackpad behavior.

Move service setup and channel editing into bounded dialogs. Keep model retrieval status beside its button and reserve the model selector on the right so verification controls do not move. Size shortcut controls to their key labels and replace the welcome input's blue outline with an underline. Update the canonical architecture/acceptance contracts and all eight UI locales.

Make the default capsule and translation badge follow the app theme with readable translucent surfaces. The WebView pill fades from slight blur over 240 ms, exits over 180 ms, and resumes from its painted pose when interrupted. The native helper shares the palette and softer fade; macOS adds a pill-bounded system material beneath the OpenGL content, while Windows retains translucent rendering. Update native smoke fixtures to protocol v2 and cover light, dark and system themes. The Windows lifecycle fixture now uses a lightweight stdin-draining process, and the permission test waits for the asynchronous settings invocation.

Keep live and hidden capsule windows synchronized when the theme changes. Every WebView subscribes to native preference changes before its boot read; late startup responses cannot overwrite a newer theme. Native helpers restyle their current frame on preference events without restarting, reopening an idle capsule or changing session/exit state. Add same-window, hidden-window, system-following and stale-boot-read regressions.

Validation:

  • Theme follow-up 0d4f0907: no local builds. Cloud CI, automated review and artifact-only desktop builds are running for this head.
  • New browser regressions cover live light/dark switches, a hidden capsule's next recording, switching into and out of system appearance, and a late startup read. Native regressions preserve recording/processing/exit state and keep idle capsules closed.
  • Previous head 7e21972c passed all 24 CI checks and both 212-case UI suites. These results do not substitute for the current head's checks.
  • The desktop packaging dispatch uses the feature branch with no release tag; installation artifacts are downloaded from Actions and no Release is published.

Reference entry for the local browser preview: /?onboarding=1&os=mac or /?onboarding=1&os=win. Preview permissions/settings remain simulated and desktop onboarding progress is not written by the preview.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-30T10:17:57.580946Z
We couldn’t complete this review. Comment @codex review to try again.
f2965d4 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4c9894d7e1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread openless-all/app/src/App.tsx Outdated
setGate('ready');
return;
}
const credentials = await getCredentials();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep credential probe failures from blocking startup

When the get_credentials IPC call rejects (for example, if the backend is temporarily unavailable after the startup handshake), this async startup effect exits without setting gate or handling the error. The app therefore remains on CoreStartupScreen indefinitely, whereas the previous permission-gate path caught probe failures and continued to the app; wrap this probe in the existing startup error fallback so users can still reach the UI.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 84c601858a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread openless-all/app/src/App.tsx Outdated
setGate('ready');
return;
}
const credentials = await getCredentials();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep credential probing out of the blocking startup gate

When the credential store IPC call hangs (for example while the backend or OS credential service is temporarily unresponsive), this await prevents the startup effect from reaching the Windows hotkey timeout or any permission fallback, so the app remains on CoreStartupScreen indefinitely. getCredentials ultimately performs a raw Tauri invoke without a timeout; probe it after showing the app or race it with a bounded fallback so a slow credential service cannot block startup.

Useful? React with 👍 / 👎.

@appergb appergb changed the title feat(app): add centered setup guide and smooth page handoffs Polish desktop onboarding, page transitions, and themed capsules Oct 26, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 82ac582f0d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread openless-all/app/src/App.tsx Outdated
setGate('ready');
return;
}
const credentials = await getCredentials();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Handle credential probe failures during startup

When the newly added getCredentials() IPC call rejects, this startup effect exits before setting gate, leaving the app on CoreStartupScreen indefinitely. The current commit still awaits the raw probe without a catch or fallback, so a transient backend or credential-service failure prevents users from reaching the UI; preserve the existing startup fallback and continue to the app or onboarding state.

Useful? React with 👍 / 👎.

Comment thread openless-all/app/src/App.tsx Outdated
setGate('ready');
return;
}
const credentials = await getCredentials();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bound the credential probe before blocking startup

If getCredentials() hangs rather than rejects—for example while the backend or OS credential service is temporarily unresponsive—this await prevents the effect from reaching the Windows hotkey timeout or any fallback, so startup remains on CoreStartupScreen indefinitely. The current commit still performs an unbounded raw IPC await; race it with a bounded fallback or move the probe after the main UI is shown.

Useful? React with 👍 / 👎.

@H-Chris233 H-Chris233 added area:ui UI area area:ux UX area enhancement New feature or request large-change Large or risky change needs-review Needs review needs-tests Needs tests P2 Medium priority platform:linux Linux-specific platform:macos macOS-specific platform:windows Windows-specific labels Oct 27, 2026
@appergb appergb added the branch-retained Keep source branch while the pull request remains open label Oct 30, 2026
…etup

# Conflicts:
#	openless-all/app/e2e/fixtures/capsule-motion.tsx
@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f07ce04f66

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +171 to +176
const finish = () =>
run(async () => {
// The parent's handoff prepares the main bundle before removing this surface.
deferPostGuidePrompts();
await onComplete();
persist({ ...progress, name: name.trim().slice(0, 40), finished: true });

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep “Explore first” from completing onboarding

The header's skipAll action calls this same finish handler, which always persists finished: true after entering the app. As a result, users who choose “Explore first” are treated as having permanently completed onboarding and the next launch bypasses the guide (App checks progress?.finished); this contradicts the intended skip/defer behavior and prevents the guide from resuming unless the user discovers the separate reopen control.

Useful? React with 👍 / 👎.

@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b12176a809

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread openless-all/app/src/App.tsx Outdated
Comment on lines +384 to +388
const progress = readGuideProgress();
if (progress?.finished) {
setGate('ready');
return;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Recheck permissions after onboarding is marked finished

When ol.desktopOnboarding.v1 has finished: true, this early return skips the Windows hotkey-status check and the macOS microphone/accessibility checks on every subsequent launch. If a user later revokes a permission or the hotkey hook fails, the app still enters ready instead of reopening the permission flow, leaving dictation unavailable without an actionable startup gate.

Useful? React with 👍 / 👎.

Comment on lines +46 to +49
const [committed, setCommitted] = useState<Surface>({ key: contentKey, children });
const retained = useRef(committed);
const latest = useRef({ key: contentKey, children });
latest.current = { key: contentKey, children };

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the current surface synchronized when its key is unchanged

The committed surface stores the initial children and is only replaced when contentKey changes. Parent rerenders with the same key therefore keep rendering a stale element tree; for example, FloatingShell computes the ol-conservative-scope class from updated preferences, but toggling conservative layout while remaining on the same tab leaves the old class in place until navigation remounts the surface.

Useful? React with 👍 / 👎.

@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: 4e5b4bb474

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: 8836596956

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

An unknown error occurred
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

An unknown error occurred
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

1 similar comment
@appergb

appergb commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@appergb
appergb merged commit b18e5b8 into beta Oct 30, 2026
13 checks passed
@appergb
appergb deleted the feat/desktop-guided-setup branch October 30, 2026 10:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:ui UI area area:ux UX area branch-retained Keep source branch while the pull request remains open enhancement New feature or request large-change Large or risky change needs-review Needs review needs-tests Needs tests P2 Medium priority platform:linux Linux-specific platform:macos macOS-specific platform:windows Windows-specific

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants