Repository navigation
feat(app): redesigned Home behind the home-redesign A/B flag (recording pill, upgrade in place) - #21711
feat(app): redesigned Home behind the home-redesign A/B flag (recording pill, upgrade in place)#21711YinkaAdepoju wants to merge 19 commits into
Conversation
…1445, rebased on main) Home: recording lives in the bottom bar (Ask Omi beside "+ New Recording", live pill while capturing), the processing row reads as the conversation it is becoming, text-only empty states, Omi pull-to-refresh, Home fades in after onboarding, a closable "Teach Omi your voice" card. Chat opens with Omi's welcome and starters. Tasks: ticking or reopening a task shows its new state, then folds the row away; a more menu. Sign-in and data & privacy: the Omi pendant on the plain surface; signed-out readers open on sign-in (the old Get started page is removed). Upgrade: a plan card with Upgrade in Settings; locked conversations and memories, transcription settings, chat apps, chat quota and the plus meter open the paywall in place (PaywallRouter, then the plans sheet). Paywall re-ask on app open for free readers behind `paywall-reask` (prereg in paywall_reask.md). Control is exposed at the end-of-onboarding placement when its payload turns it on. No Superwall. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o-dos when onboarding found none; UI evidence Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… opens the paywall in place Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the pendant) The launch film is the sign-in look for everyone now, not a debug-only comparison; the pendant hero and its image are removed. UI evidence swapped to the film captures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tom pill, not a Home card The pill reads Reconnecting… (no live pulse) and Home shows no separate card; the card stays for what needs the person (paused, the microphone taken by a call, transcription that failed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at the tap opens Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ows; no top card
Every state the Home card had now reads in the bottom pill: Listening, Reconnecting…, Paused
(its control is Resume), Transcribe Later ("Recording · Audio saved…"), the mic taken by a call,
transcription failed, storage full, and a pendant that dropped mid-capture ("Disconnected ·
Reconnecting…"). The dot says how it is going: red and breathing while capturing fine, grey when
paused or waiting, orange when something needs a look. Tapping a healthy pill opens the live
transcript; otherwise it opens a sheet with why, the capture card's own controls (Pause/Resume,
New recording, retry), the live transcript and Stop.
One summary (live_capture_summary.dart) feeds both the pill and the card, so they never disagree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n main; read the pendant's reconnecting state once per build Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Data & privacy: Agree & Continue again, and "Use a Different Account" is back (it was required but no longer shown, so a wrong account could only go forward by agreeing). - Sign-in fires the onboarding welcome event the removed Get started page used to fire; drop an unused analytics helper. - Home pill: a pendant that dropped mid-capture no longer blocks recording — its sheet and a long press record with the phone. Tapping the pill while the mic starts no longer opens the live transcript twice. The sheet's Stop only ever finishes a recording, never starts a new one. - Starter to-dos refresh the Tasks list once created. - The deferred firmware prompt checks the device is still connected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ka/app-redesign-upgrade Resolved: Activity bell sits in the shell header on Home and Tasks (the top bar stays identical); the device pill keeps its word on every page and shrinks with an ellipsis; pull-to-refresh also reloads Review; translations keep both branches' strings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… uploaded yet while Processing rows show David's pending row (BasedHardware#21689) and the Processing rows could both stand for the same recording once its audio reached the server. The pending row now counts uploaded audio only while Home lists no Processing row; audio still waiting or uploading always counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e, control shows today's One client-evaluated flag (`home-redesign`, prereg product/experiments/home-redesign.md) decides which Home a reader sees: the bottom recording pill (no card above the list), condensing processing row, text-only empty states, pull-to-refresh, page actions beside the switcher, locked rows that upgrade in place, Tasks fold, closable voice card, chat welcome, Tasks dot and starter to-dos — or today's Home (chat bar + round record button + live card, kept in app/lib/pages/home/legacy/ until the experiment is decided). Unread flag = control. The arm is saved per account, read during onboarding so new readers start in theirs, and never switches a Home already on screen. Exposure is `$feature_flag_called`, once per account and arm, when Home is first shown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ath tests for locked rows and the processing row; flag waits for the identity via a listener, not polling; fresh pill screenshots Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t of BasedHardware#21711 into their own PRs Both now live on their own branches (yinka/paywall-reask, yinka/signin-film). This branch keeps main's sign-in, Data & Privacy and Get started screens, and no app-open re-ask. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks @YinkaAdepoju — this is a well-built PR, and the rebasing of #21445 onto main as one coherent piece was the right call. Reviewed statically on 23eab70. Detailed notes below; several items genuinely need a maintainer's product call before this leaves draft. What stands out as solid
Product decisions that need a maintainer before merge
Minor, non-blocking
Leaving for human maintainer review — the open questions above are product-direction decisions (monetization surfaces, onboarding entry, synthetic user data), not code defects. Nothing security- or supply-chain-sensitive turned up: no new dependencies ( by AI on behalf of David — if you need David’s attention urgently, please @Git-on-my-level and escalate with |
…me copy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iment (486169) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks David! Updates since the review (it was on 23eab70):
Full suite 5,904 passing, |
kodjima33
left a comment
There was a problem hiding this comment.
Large mobile Home redesign behind off-by-default A/B flag - feature, approve-only. DIRTY so can't merge anyway.
|
Reviewed the full diff on this head. Thank you @YinkaAdepoju — this is an unusually disciplined experiment PR, and it shows in the details: Flag mechanics (verified against the code):
One point worth a maintainer's eye: Docs note: the
With the approval on record, the remaining human decision is the launch itself: activating PostHog flag 963799 once this build is in the stores. Leaving This review was prepared by an AI reviewer operating on the maintainer's behalf. by AI on behalf of David — if you need David’s attention urgently, please @Git-on-my-level and escalate with |
Summary
A redesigned mobile Home, behind a PostHog A/B flag so it can be measured against today's Home before it ships to everyone.
home-redesign(test= this redesign,control/ unread = today's Home). Not created in PostHog yet, so until it is, every reader sees today's Home and this PR changes nothing for them.product/experiments/home-redesign.md: question, arms, exposure, primary metric (readers with ≥1 new conversation in 7 days), guardrails, decision rule, kill switch.What the redesigned Home changes (
testarm)One place for a live recording: the bottom pill. There is no recording card above the list anymore. The bottom bar is Ask Omi beside one pill, and the pill always says three things:
Tapping a healthy pill opens the live transcript. Otherwise it opens a sheet with why, the capture's own controls (Pause/Resume, Transcribe Later's New recording and Stop, retry transcription), the live transcript, Stop, and, for an Omi that dropped, "Record with phone instead". The pill and the sheet read one shared summary (
conversations/live_capture_summary.dart), so they never disagree.Also in the
testarmpaywall-variantrouter), instead of View Usage → the Usage page.Today's Home (
control) is unchanged: the Ask Omi chat bar with the round record button, the recording card above the list, today's processing row, empty states with icons, the calendar in the header, locked rows → Usage. Its widgets are kept inapp/lib/pages/home/legacy/until the experiment is decided; the losing path gets deleted then.Shared by both arms (not part of the comparison): the Activity bell and pending row (#21689), the Tasks menu in the header (select, group, completed, export), the Settings plan card with Upgrade, and the end-of-onboarding control exposure for
paywall-variant.How the flag behaves
$feature_flag_calledforhome-redesign, once per account and arm, when Home is first shown after PostHog assigned an arm.$feature/home-redesignthen tags later events.control100% (or turn it off); every build shows today's Home without a release.--dart-define=OMI_HOME_REDESIGN=onor=off.Review notes
SyncPendingWork.shouldShowOnHome).app/lib/pages/home/legacy/legacy_home.dartis a copy of main's widgets, not new design: please skim, don't review line by line.Screenshots
testarm on the iOS simulator against the local dev server (001–004 today; 005–007 from the earlier #21445 branch).Testing
make preflight: 30/30 checks pass.test/unit/home_redesign_test.dart(unread = control, per-account memory, never switches a Home on screen, exposure only after assignment, no read before an identity); off-path tests for locked rows (View Usage → Usage page) and the processing row (today's widget); pill tests for every recording state (no card on Home, Paused + Resume, failure opens the sheet, Omi paused / dropped / Transcribe Later, Record with phone); the Today-rows stage split.Line-count exceptions
Line-Count-Exception: app/lib/backend/preferences.dart | 1538 -> 1543 | one setting: the closed "Teach Omi your voice" card
Line-Count-Exception: app/lib/pages/settings/transcription_settings_page.dart | 1572 -> 1575 | upgrade opens the paywall in place instead of the Usage page
Line-Count-Exception: app/lib/providers/device_provider.dart | 1598 -> 1614 | a firmware prompt found during onboarding waits until Home is up
Product invariants affected
testarm a locked memory row opens the paywall in place instead of the Usage page.Failure-Class: none
🤖 Generated with Claude Code