feat(app): Settings top level is Account plus seven groups; calmer Ask Omi

Merged
GI
22d ago
+1635-426

A smaller Settings top level, and a calmer Ask Omi

David, 2026-09-24:

  1. 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 (new OmiButton.toolbar variant: surface-1 fill, primary text),
    so the top bar reads as one row. No white primary.
  2. 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

  1. Account (name, email as subtitle) → Name, Email, Plan & Usage, Referral Program, User ID; then Sign Out
    and Delete Account at the bottom.
  2. Device → Device settings (while connected), Offline Sync, Phone Calls.
  3. Recording & Transcription → Transcription, Language, Custom Vocabulary · Voice Profile, Identifying
    Others, Voice Response · Conversation Timeout · Recording (Beta): Transcribe Later, Background Mode (Android).
  4. Notifications & Display → Notifications, Home Screen, Conversation Display.
  5. Integrations (Beta) → the Integrations page directly.
  6. Data & Privacy → Data Protection, Memories, Permissions, Export All Data, Import Data.
  7. Help & About → Feedback / Bug and Help Center (where Intercom is supported), What's New, version.
  8. 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.

RowOld locationNew locationDepth before → after
Profile (now Account: name, email subtitle)SheetSheet, first row → Account page0 → 0
NotificationsSheetNotifications & Display0 → 1
Plan & Usage (Pro value)SheetAccount0 → 1
Device Settings (only while connected)SheetDevice0 → 1
Transcription (provider value)Sheet › ConversationsRecording & Transcription0 → 1
Conversation DisplaySheet › ConversationsNotifications & Display0 → 1
Conversation Timeout (subtitle)Sheet › ConversationsRecording & Transcription0 → 1
Offline SyncSheet › ConversationsDevice0 → 1
Phone CallsSheet › ConversationsDevice0 → 1
Home ScreenSheet › ConversationsNotifications & Display0 → 1
Data ProtectionSheet › Data & PrivacyData & Privacy0 → 1
Export All Data (spinner)Sheet › Data & PrivacyData & Privacy0 → 1
Import DataSheet › Data & PrivacyData & Privacy0 → 1
PermissionsSheet › Data & PrivacyData & Privacy0 → 1
Integrations (Beta)Sheet › Data & PrivacySheet → Integrations page directly0 → 0
Feedback / Bug (Intercom only)SheetHelp & About0 → 1
Help Center (Intercom only)SheetHelp & About0 → 1
What's NewSheetHelp & About0 → 1
Referral Program (New tag)SheetAccount0 → 1
Developer SettingsSheetSheet, last row0 → 0
Sign Out (same confirmation)SheetAccount, bottom group0 → 1
Version and copy button (iOS/Android)Bottom of sheetBottom of Help & About0 → 1
NameProfileAccount1 → 1
EmailProfileAccount1 → 1
LanguageProfileRecording & Transcription1 → 1
Custom VocabularyProfileRecording & Transcription1 → 1
MemoriesProfileData & Privacy1 → 1
Voice ProfileProfileRecording & Transcription1 → 1
Identifying OthersProfileRecording & Transcription1 → 1
Voice ResponseProfileRecording & Transcription1 → 1
Background Mode (Android, same logic)Profile › Recording (Beta)Recording & Transcription › Recording (Beta)1 → 1
Transcribe LaterProfile › Recording (Beta)Recording & Transcription › Recording (Beta)1 → 1
User ID (copy)ProfileAccount1 → 1
Delete AccountProfileAccount, bottom group1 → 1
Creator PayoutsDeveloper Settingsunchanged1 → 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") with page_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, helpAndAbout in 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 at 651381049c. 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