Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
c02279f
Add gated iOS Superwall usage paywall pilot
Oct 12, 2026
e20dd90
Add plan card with Upgrade button to Settings
Oct 12, 2026
af40c66
Open the upgrade paywall in place for locked conversations and memories
Oct 12, 2026
4afdecc
Offer the device_setup_complete paywall after the first device tutorial
Oct 12, 2026
e1e88bc
Offer device_setup_complete to every non-subscriber leaving the tutorial
Oct 12, 2026
4bf7ee3
Name a Superwall placement for every remaining upgrade entry point
Oct 12, 2026
4dbbc2a
Redesign first-run onboarding up to Connect your Omi
Oct 12, 2026
043810b
Refine onboarding redesign: layout, toggles, Connect Omi, transitions
Oct 12, 2026
910ee5a
Centre permissions and language, arrive at Connect Omi as a moment
Oct 12, 2026
424c5a1
Give the Bluetooth alert a reason as well as the action
Oct 12, 2026
076fbfc
Keep the onboarding device choice on the person
Oct 12, 2026
5a84112
Keep Connect Omi from leaking search state into in-app pairing
Oct 12, 2026
fc4e6b1
Open the Omi store in the app from "Not ordered yet"
Oct 13, 2026
93e767c
Make the data & AI consent a light card over the sign-in photo
Oct 13, 2026
39d7e51
Consent: Continue at thumb height with the agreement line below; shop…
Oct 13, 2026
9608daf
Consent: AI providers in the same size and colour as the statement above
Oct 13, 2026
97e2c85
Replace the voice step with the activation: Omi at work, first conver…
Oct 13, 2026
2159265
Tighten onboarding activation: rating before paywall, fewer screens
Oct 13, 2026
ca775d0
Onboarding activation: a real summary, animated to-dos, one title style
Oct 13, 2026
b4d5d06
Onboarding hooray: drop the sub-copy, lift the check under the title
Oct 13, 2026
c618097
Onboarding: make the Omi owner's path hold up
Oct 13, 2026
3afd867
Merge origin/main into the onboarding redesign
Oct 13, 2026
9244a9a
Merge the Superwall paywall pilot into the onboarding redesign
Oct 13, 2026
da42a5b
Show the Superwall device_setup_complete paywall at the end of onboar…
Oct 13, 2026
d069cbd
Onboarding rating: a tap after the review pop-up moves on to the paywall
Oct 13, 2026
40396bb
Home voice card: closable, then found in Settings
Oct 13, 2026
0684711
Merge branch 'yinka/onboarding' into yinka/onboarding-superwall
Oct 13, 2026
e70f059
Onboarding activation: stop the mic on an early Skip, no back-swipe o…
Oct 13, 2026
9eeed75
Home/Tasks header: one steady top bar, page actions beside the switcher
Oct 13, 2026
7dc95bf
Home bottom bar: Ask Omi beside a light "+ New Recording" pill
Oct 13, 2026
7d94795
Onboarding activation: save the reader's voice, never stall on Summar…
Oct 13, 2026
c9910bc
Onboarding dictation: a clear Continue when listening fails or nothin…
Oct 13, 2026
5d01c0a
Onboarding: A/B the ending between the voice introduction and the act…
Oct 13, 2026
26b54fd
Merge branch 'yinka/onboarding-ab-flag' into yinka/onboarding-superwall
Oct 13, 2026
be8f630
Merge origin/main into the onboarding redesign
Oct 13, 2026
7a0e694
Remove the first-capture onboarding ending (revert #21396)
Oct 13, 2026
8ae58fa
Onboarding A/B: honour the ending override in local_dev release builds
Oct 13, 2026
5aaaf82
Add mobile changelog fragment for the onboarding redesign and Home bar
Oct 13, 2026
30c83b7
Onboarding confetti: teal instead of lavender (brand: no purple)
Oct 13, 2026
76d684a
Onboarding: document the deliberate fixed colours and glyph sizes (UX…
Oct 13, 2026
cf8765d
Onboarding: keep UX-contract allowances on the lines they cover
Oct 13, 2026
9569b2a
Onboarding toggle: keep the white-thumb allowance on its line
Oct 13, 2026
ed252ca
Remove the unused "Where did you hear about Omi" step
Oct 13, 2026
e7d01dc
Onboarding: edge cases from review (resume, failed save, control pari…
Oct 13, 2026
b3ace82
Debug builds show the activation ending and the Superwall paywall by …
Oct 13, 2026
8166479
Omi's first chat message and a Tasks dot after onboarding
Oct 13, 2026
5f07e38
UI evidence: onboarding activation, Superwall end paywall, Home and c…
Oct 13, 2026
d6a2a56
Onboarding: no too-short banner, steady Connect Omi, device tutorial …
Oct 13, 2026
388cb0d
Onboarding dictation shows Omi hearing you; Home drops the pendant Li…
Oct 13, 2026
73267e3
Onboarding haptics at the moments that matter
Oct 13, 2026
299af0d
Starter tasks after onboarding when it found none
Oct 13, 2026
ed10b9e
Level meter bars use the pill radius token
Oct 13, 2026
65f2727
Sign-in and consent: the Omi pendant on the onboarding surface, no ph…
Oct 13, 2026
f199e15
Sign-in: omi wordmark over the promise; Data & Privacy: centred and q…
Oct 13, 2026
e3191d0
Sign-in and consent: headline centred, buttons at the standard height…
Oct 13, 2026
d4cd0fa
Onboarding: open on sign-in, button tutorial right after connecting, …
Oct 13, 2026
48e5187
Onboarding: microphone ask shows the listening control it leads to
Oct 13, 2026
0e9c0b9
Home: recording lives in the bottom bar; no card while it is healthy
Oct 13, 2026
0ec357d
Merge origin/main into onboarding redesign (without #21426 onboarding…
Oct 13, 2026
27171b0
Onboarding A/B: send the PostHog variant on the exposure event
Oct 13, 2026
0cc06a3
Feature-flag registry: onboarding-activation-flow now exists in PostHog
Oct 13, 2026
e628dcb
UI evidence: fresh iOS screenshots of the merged onboarding, paywall …
Oct 13, 2026
e587b5f
UI evidence: sign-in and the control arm's voice introduction
Oct 13, 2026
01de76c
UI evidence: sign-in and Data & Privacy over the launch film
Oct 14, 2026
00564b9
Merge origin/main: route upgrade entry points through the paywall exp…
Oct 14, 2026
52b64a5
Superwall pilot is opt-in; upgrade entry points default to the paywal…
Oct 14, 2026
198dcf7
feat(app): paywall re-ask on app open for free readers (A/B, flag pay…
Oct 14, 2026
1cb186a
UI evidence: paywalls through the #21450 router (Outline, control) an…
Oct 14, 2026
480baf4
Paywall re-ask: gentler schedule (2, 3, 5, then every 7 days)
Oct 14, 2026
5888dcb
Onboarding: buttons sit higher (24pt above the home bar) on every ste…
Oct 14, 2026
a088d92
Onboarding summary: 'Omi remembers so you don't have to' above the ti…
Oct 14, 2026
4f76b4c
Onboarding: read-along dictation, condensing summary, summary reveal;…
Oct 14, 2026
96563e2
Home: a phone recording that is starting shows in the bottom pill at …
Oct 14, 2026
c5dd9f8
Onboarding summary: render Omi's markdown notes and keep long notes i…
Oct 14, 2026
310e6d7
Onboarding dictation: Omi's words land visibly
Oct 14, 2026
5c12e5b
Tasks: ticking (or reopening) a task shows its new state, then folds …
Oct 14, 2026
15012c2
Home: the processing row reads as the conversation it is becoming
Oct 14, 2026
e46019b
Onboarding with an Omi: a Connected moment, one way out of the tutori…
Oct 14, 2026
0143f69
Paywall experiment: expose control at the end-of-onboarding placement
Oct 14, 2026
d0013ef
Device tutorial: a failed question ends 'processing your question'
Oct 14, 2026
61b7426
Home and Tasks: text-only empty states
Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
179 changes: 0 additions & 179 deletions .agent-artifacts/ui-evidence/onb-m-firstcapture/evidence.json

This file was deleted.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
166 changes: 166 additions & 0 deletions .agent-artifacts/ui-evidence/yinka-onboarding-superwall/evidence.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
{
"version": 1,
"images": [
{
"file": "001-mobile-ios-onboarding-sign-in.png",
"platform": "mobile-ios",
"description": "Sign-in over the launch film, no Get Started screen (OMI_ONBOARDING_HERO=video; local test build shows one local sign-in button where store builds show Apple/Google)",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "002-mobile-ios-onboarding-data-privacy.png",
"platform": "mobile-ios",
"description": "Data & Privacy over the launch film",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "003-mobile-ios-onboarding-name.png",
"platform": "mobile-ios",
"description": "Name, focused and ready to type",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "004-mobile-ios-onboarding-permissions.png",
"platform": "mobile-ios",
"description": "Permissions as simple toggle cards, both answered",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "005-mobile-ios-onboarding-language.png",
"platform": "mobile-ios",
"description": "Language, pre-selected from the phone",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "006-mobile-ios-connect-omi.png",
"platform": "mobile-ios",
"description": "Connect Omi with I've ordered mine / Not ordered yet",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "007-mobile-ios-activation-intro.png",
"platform": "mobile-ios",
"description": "Activation intro: Let's try Omi",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "008-mobile-ios-activation-microphone.png",
"platform": "mobile-ios",
"description": "Microphone ask: the mic control the dictation uses",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "009-mobile-ios-activation-dictation-live.png",
"platform": "mobile-ios",
"description": "Dictation: the user's words appear live",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "010-mobile-ios-activation-summarizing.png",
"platform": "mobile-ios",
"description": "Summarizing, with the user's words",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "011-mobile-ios-activation-summary.png",
"platform": "mobile-ios",
"description": "The first conversation's summary",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "012-mobile-ios-activation-todos.png",
"platform": "mobile-ios",
"description": "To-dos found in it, saved to Tasks",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "013-mobile-ios-activation-all-set.png",
"platform": "mobile-ios",
"description": "You're all set",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "014-mobile-ios-activation-rating.png",
"platform": "mobile-ios",
"description": "Rating ask with the App Store prompt",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "015-mobile-ios-superwall-paywall-end.png",
"platform": "mobile-ios",
"description": "Superwall paywall at the end of onboarding (iOS debug pilot; mock products, so prices are blank)",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "016-mobile-ios-home-after-onboarding.png",
"platform": "mobile-ios",
"description": "Home after onboarding: the first conversation and a dot on Tasks",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "017-mobile-ios-chat-welcome-message.png",
"platform": "mobile-ios",
"description": "Omi's first chat message in an empty chat",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "018-mobile-ios-home-live-pill.png",
"platform": "mobile-ios",
"description": "Bottom-bar live pill while the phone records (local server has no transcription, so the Reconnecting card also shows)",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "019-mobile-ios-activation-control-ending.png",
"platform": "mobile-ios",
"description": "Control arm: today's guided voice introduction, unchanged",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "020-mobile-ios-activation-outline-paywall.png",
"platform": "mobile-ios",
"description": "End of the activation through #21450's router, Outline arm (OMI_PAYWALL_VARIANT=outline; local server has no plan catalog, so prices don't load)",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "021-mobile-ios-activation-control-plans-sheet.png",
"platform": "mobile-ios",
"description": "End of the activation, control arm (no overrides): the onboarding plans sheet; closing it goes straight to Home, no second paywall",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "022-mobile-ios-paywall-reask-on-resume.png",
"platform": "mobile-ios",
"description": "Paywall re-ask on returning to the app (OMI_PAYWALL_REASK=test, OMI_PAYWALL_REASK_NOW=true to make it due now)",
"captured_by": "agent",
"source": "screencapture"
},
{
"file": "023-mobile-ios-settings-upgrade-outline.png",
"platform": "mobile-ios",
"description": "Settings > Upgrade through the router, Outline arm",
"captured_by": "agent",
"source": "screencapture"
}
]
}
Binary file added app/assets/images/omi_pendant_glow.png
Binary file removed app/assets/images/onboarding.mp4
Binary file not shown.
Binary file added app/assets/videos/onboarding_launch_loop.mp4
Binary file not shown.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"change": "A simpler first-run setup that helps you connect your Omi, plus a cleaner Home with a New Recording button"
}
3 changes: 0 additions & 3 deletions app/changelog/unreleased/20261014-onboarding-polish.json

This file was deleted.

2 changes: 0 additions & 2 deletions app/contracts/addressability/unkeyed-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,8 @@
"app/lib/pages/onboarding/apple_watch_permission_page.dart": 9,
"app/lib/pages/onboarding/auth.dart": 6,
"app/lib/pages/onboarding/complete_screen.dart": 2,
"app/lib/pages/onboarding/device_selection.dart": 2,
"app/lib/pages/onboarding/find_device/found_devices.dart": 1,
"app/lib/pages/onboarding/find_device/page.dart": 2,
"app/lib/pages/onboarding/found_omi/found_omi_widget.dart": 4,
"app/lib/pages/onboarding/interactive_device_onboarding/interactive_device_onboarding_wrapper.dart": 1,
"app/lib/pages/onboarding/interactive_device_onboarding/steps/double_press_config_step.dart": 1,
"app/lib/pages/onboarding/interactive_device_onboarding/widgets/onboarding_intro_screen.dart": 2,
Expand Down
29 changes: 29 additions & 0 deletions app/docs/superwall-pilot.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Superwall paywall pilot

Upgrade entry points (end of onboarding, locked conversations and memories, chat quota, Settings, Usage) go through the paywall experiment (`PaywallRouter`, flag `paywall-variant`): its arm's page, or Omi's existing plans sheet and Stripe checkout for control, paid readers and any failure. On **iOS debug builds** with `--dart-define=SUPERWALL_TEST_MODE=true`, free users get a **Superwall** paywall first instead, using the pilot's own Superwall test project (public SDK key built in as the default); `--dart-define=SUPERWALL_API_KEY_IOS=<key>` points at another project. Store builds and Android never configure Superwall.

## Before production

- Omi sets up its own Superwall project (paywall design, campaigns for the placements below) and replaces the test key.
- The plans are created as in-app purchase subscriptions in **App Store Connect** and attached to the paywall's product slots (the test project uses mock products, so prices show blank).
- Purchases must be reconciled to Omi subscriptions on the backend (Superwall webhooks or StoreKit server notifications), with restore and manage-subscription paths, before the pilot gate is removed.

## Dashboard setup

1. Use the public iOS SDK key from the Superwall project's Settings → API Keys. Never use a webhook secret or store private key in a `--dart-define` or commit it.
2. Attach the Calorie Tracker (Template) paywall to an isolated campaign for placement `omi_usage_upgrade_test`. Its sample purchase buttons are only for visual testing until sandbox products are configured.
3. Run the app in the dev flavor with the local profile. Example for iOS:

```sh
flutter run --flavor dev --dart-define=OMI_APP_PROFILE=local_dev --dart-define=SUPERWALL_TEST_MODE=true --dart-define=SUPERWALL_API_KEY_IOS=YOUR_PUBLIC_TEST_KEY
```

The current app setup and local auth emulator must also be running; see `app/AGENTS.md` and `app/setup.sh`.

4. Sign in, open Settings → Usage, and tap Upgrade. The pilot identifies the signed-in Firebase UID before registering the placement. Signing out resets the Superwall identity.

## Boundaries

- A configured paywall can offer a store purchase. Use sandbox/test store products and accounts only. This branch does not ingest Superwall purchase webhooks, reconcile App Store/Play purchases to Omi subscriptions, or grant Omi entitlements. A successful store purchase must not be treated as a successful Omi subscription until that backend path exists.
- The app's iOS deployment target (15) meets the SDK's documented minimum.
- Before a production rollout, decide the billing/catalog policy, add verified purchase lifecycle handling, reconcile Omi UID with Superwall's original user ID, add restore/manage behavior, and run store sandbox purchase and entitlement tests on devices.
Loading
Loading