Skip to content

W-451: Onboarding refresh + symbols on by default#153

Merged
wr merged 1 commit into
mainfrom
wells/w-451-onboarding-refresh-features-step-calmer-done-screen-symbols
Jun 26, 2026
Merged

W-451: Onboarding refresh + symbols on by default#153
wr merged 1 commit into
mainfrom
wells/w-451-onboarding-refresh-features-step-calmer-done-screen-symbols

Conversation

@wr

@wr wr commented Jun 26, 2026

Copy link
Copy Markdown
Owner

Reworks onboarding to feel less pushy and more useful.

What's in it

  • New "Set up your features" step (Welcome → Set up your features → Permissions → Done): enable/disable Emoji, Symbols, GIF and pick each trigger, reusing the Settings section headers + trigger pickers.
  • Removed the big "Replace system emoji picker" CTA step and the "More options" overlay. Replace is now a calm toggle on the Done screen; Automatic updates + Start at login sit in a second section there.
  • Live "try it out" field on Done (autofocused, placeholder :smile) — DoneStep posts a mojitoShouldStartEngine notification so the engine starts early enough for shortcuts to expand right in the field.
  • Stats consent moved into the onboarding Privacy details sheet (which marks consent seen on appear). Skipping it still fires the existing one-time consent prompt after onboarding, so nothing is sent before disclosure.
  • Symbols now default ON for fresh installs (TriggerConfigStore.migrate + TriggerConfig.default), blended into emoji search via follow-emoji — matching emoji/GIF. Existing users' saved configs are untouched.

Test plan

  • Onboarding: Welcome → Features (all three on; symbols "Same as emoji") → Permissions → Done.
  • Done: replace toggle works; updates/login in their own section; the :smile field is focused and expands live.
  • Skip Privacy details → consent prompt appears after finishing; open it → no prompt; nothing sent before either.
  • Fresh config defaults symbols on; existing config unaffected.
  • Unit suite green (228 tests; updated the symbols-default tests).

Notes

  • Symbols-on-by-default is a behavior change for new installs — worth a v1.7.0 release note.

Independent code review: clean, no high-confidence issues.

Refs W-451

- New "Set up your features" step (welcome → features → permissions → done):
  enable Emoji / Symbols / GIF and pick each trigger, reusing the Settings
  section headers + trigger pickers.
- Drop the dedicated "Replace system emoji picker" CTA step and the "More
  options" overlay. Replace is now a toggle on the Done screen; autoupdate +
  start-at-login live in a second section there.
- Add an autofocused, live "try it out" field (:smile) on Done — DoneStep posts
  mojitoShouldStartEngine so the engine starts early enough to expand in place.
- Move the stats toggle into the onboarding Privacy details sheet (which marks
  consent seen on appear); skipping it still fires the one-time consent prompt,
  so nothing is sent without disclosure.
- Symbols now default ON for fresh installs (TriggerConfigStore.migrate +
  TriggerConfig.default), blended into emoji search via follow-emoji. Existing
  configs are untouched. Tests updated.

Refs: W-451
@linear-code

linear-code Bot commented Jun 26, 2026

Copy link
Copy Markdown

W-451

@wr wr merged commit 7b9bdfc into main Jun 26, 2026
4 of 5 checks passed
@wr wr deleted the wells/w-451-onboarding-refresh-features-step-calmer-done-screen-symbols branch June 26, 2026 20:12

@wr-claude-reviewer wr-claude-reviewer 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.

Reviewed the diff against CLAUDE.md conventions. This is a clean, well-scoped refactor:

  • engine.start()reconcile()KeyMonitor.start() is idempotent (guards on !isRunning / !monitor.isRunning), so the new .mojitoShouldStartEngine notification handler in AppDelegate.swift safely overlaps with the existing start() calls in applicationDidFinishLaunching and the .mojitoOnboardingFinished handler — no double-tap risk.
  • FeaturesStep mirrors GeneralSettings.swift's section headers / TriggerPicker wiring (including the takenOpens(excluding:) helper) field-for-field — confirmed by diffing the two.
  • The symbols-default flip (TriggerConfig.default + TriggerConfigStore.migrate's fallback ?? true) only changes behavior for configs with no persisted PrefsKey.triggers blob (fresh installs, per the PR description) — existing installs already have that blob from the prior migration and hit the early-return decode path in load(), untouched. Tests were updated consistently (migrationOnEmptyDefaultsEnablesAllFeatures, symbolsTriggerDefaultsOn).
  • Telemetry consent: moving the toggle into PrivacyDetailsSheet and stamping telemetryConsentSeen there, with the existing TelemetryConsent.presentIfNeeded() fallback after onboarding finishes, preserves the "nothing sent before disclosure" invariant either way (sheet opened or skipped).
  • No leftover references to the removed ReplaceEmojiStep.

CI (ssot workflow) was still in progress at review time with no failures reported, so not treating it as blocking.

Nit: FeaturesStep (OnboardingScreens.swift) duplicates GeneralSettings.swift's takenOpens(excluding:) helper and the three Section/SettingsSectionHeader/TriggerPicker blocks verbatim. Not required to fix, but if this pattern gets a third caller, worth factoring into a shared view.

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