feat(app): Settings top level is Account plus seven groups; calmer Ask Omi
Merged
GI
22d ago+1635+1635+0123456789012345678901234567890123456789-426-426-012345678901234567890123456789
A smaller Settings top level, and a calmer Ask Omi
David, 2026-09-24:
- Ask Omi on the conversation page keeps its pill and two-bubbles glyph but uses the same fill, icon and text
colour as the Star and Share buttons beside it (newOmiButton.toolbarvariant: surface-1 fill, primary text),
so the top bar reads as one row. No white primary. - Settings had about 21 rows at the top level plus a Profile page that mixed account details with recording
settings. The top level is now Account plus seven groups.
New top level
- Account (name, email as subtitle) → Name, Email, Plan & Usage, Referral Program, User ID; then Sign Out
and Delete Account at the bottom. - Device → Device settings (while connected), Offline Sync, Phone Calls.
- Recording & Transcription → Transcription, Language, Custom Vocabulary · Voice Profile, Identifying
Others, Voice Response · Conversation Timeout · Recording (Beta): Transcribe Later, Background Mode (Android). - Notifications & Display → Notifications, Home Screen, Conversation Display.
- Integrations (Beta) → the Integrations page directly.
- Data & Privacy → Data Protection, Memories, Permissions, Export All Data, Import Data.
- Help & About → Feedback / Bug and Help Center (where Intercom is supported), What's New, version.
- Developer Settings → unchanged page, last.
Old → new mapping (every row)
Depth = taps from the open Settings sheet until the row is visible (0 = on the sheet). Nothing became
unreachable: every former top-level row is at most one tap deeper, every former Profile row stays at the same
depth. test/widgets/settings/settings_structure_test.dart pumps the real sheet, walks every page and pins this.
| Row | Old location | New location | Depth before → after |
|---|---|---|---|
| Profile (now Account: name, email subtitle) | Sheet | Sheet, first row → Account page | 0 → 0 |
| Notifications | Sheet | Notifications & Display | 0 → 1 |
| Plan & Usage (Pro value) | Sheet | Account | 0 → 1 |
| Device Settings (only while connected) | Sheet | Device | 0 → 1 |
| Transcription (provider value) | Sheet › Conversations | Recording & Transcription | 0 → 1 |
| Conversation Display | Sheet › Conversations | Notifications & Display | 0 → 1 |
| Conversation Timeout (subtitle) | Sheet › Conversations | Recording & Transcription | 0 → 1 |
| Offline Sync | Sheet › Conversations | Device | 0 → 1 |
| Phone Calls | Sheet › Conversations | Device | 0 → 1 |
| Home Screen | Sheet › Conversations | Notifications & Display | 0 → 1 |
| Data Protection | Sheet › Data & Privacy | Data & Privacy | 0 → 1 |
| Export All Data (spinner) | Sheet › Data & Privacy | Data & Privacy | 0 → 1 |
| Import Data | Sheet › Data & Privacy | Data & Privacy | 0 → 1 |
| Permissions | Sheet › Data & Privacy | Data & Privacy | 0 → 1 |
| Integrations (Beta) | Sheet › Data & Privacy | Sheet → Integrations page directly | 0 → 0 |
| Feedback / Bug (Intercom only) | Sheet | Help & About | 0 → 1 |
| Help Center (Intercom only) | Sheet | Help & About | 0 → 1 |
| What's New | Sheet | Help & About | 0 → 1 |
| Referral Program (New tag) | Sheet | Account | 0 → 1 |
| Developer Settings | Sheet | Sheet, last row | 0 → 0 |
| Sign Out (same confirmation) | Sheet | Account, bottom group | 0 → 1 |
| Version and copy button (iOS/Android) | Bottom of sheet | Bottom of Help & About | 0 → 1 |
| Name | Profile | Account | 1 → 1 |
| Profile | Account | 1 → 1 | |
| Language | Profile | Recording & Transcription | 1 → 1 |
| Custom Vocabulary | Profile | Recording & Transcription | 1 → 1 |
| Memories | Profile | Data & Privacy | 1 → 1 |
| Voice Profile | Profile | Recording & Transcription | 1 → 1 |
| Identifying Others | Profile | Recording & Transcription | 1 → 1 |
| Voice Response | Profile | Recording & Transcription | 1 → 1 |
| Background Mode (Android, same logic) | Profile › Recording (Beta) | Recording & Transcription › Recording (Beta) | 1 → 1 |
| Transcribe Later | Profile › Recording (Beta) | Recording & Transcription › Recording (Beta) | 1 → 1 |
| User ID (copy) | Profile | Account | 1 → 1 |
| Delete Account | Profile | Account, bottom group | 1 → 1 |
| Creator Payouts | Developer Settings | unchanged | 1 → 1 |
Search, routes, analytics
- Search: every moved row is still found and opens its own page; group titles are searchable. "Profile" (the
Account row's old name) is a search alias for Account and still matches Voice Profile (tested). - Routes and deep links: unchanged. Every route opens a page directly and no page moved
(/settings/data-privacy, quick actions → Device, AppShell → Plan & Usage / Asana / ClickUp). - Analytics: every existing event and name is kept. Opening a group now calls the existing
settingsPageOpened("Settings Page Opened") withpage_name= device, recording_and_transcription,
notifications_and_display, privacy_and_data, help_and_about, so group usage becomes measurable. Context: over
the last 30 days PostHog has Settings Opened 31.8k events / 5.4k users, Permissions 3.3k / 1.7k, Language 2.8k /
942, Conversation Display 2.0k / 853, Daily Summary 1.9k / 1.1k, Change Name 465 / 350, Delete Account dialog
290 / 194; "Settings Page Opened" had no page name and no caller, so per-row usage was not measurable before. - l10n: new keys
recordingAndTranscription,notificationsAndDisplay,helpAndAboutin all 49 locales; reused
account,device,integrations,dataAndPrivacy,developerSettings.
Screenshots
Fresh before (main 26790dd16b) and after (this PR's head) run of the conversation top bar and every Settings
page and sub-page: https://claude.ai/artifact/GTzdUJ5hfwXLcFZse6Eq7v (INDEX.md records SHAs and capture times).
Verification (hermetic tests and static checks on this Mac, Flutter 3.44.5, TZ=UTC)
bash app/test.sh: 2928 passed at651381049c. Analyzer ratchet,l10n.py check(49 locales, 3337 keys),
INV-UI-3, INV-UI-1, line-count, dead-code and addressability checks pass.
Product invariants affected
- INV-UI-1: no purple added.
- INV-UI-3: the touched files stay within the mobile UX contract ratchet.
Failure class (fixes)
Failure-Class: none
🤖 Generated with Claude Code