Operating
Wizard Is the Universal Product Entrypoint
Onboarding on every surface (web and mobile) is one product - capture the crux into a W Card and seed the project context. Wizard is that entrypoint, not a mobile app.
Status: Accepted · 2026-06-09
Scope: repo:main (platform + app.askthew.com) and the Wizard iOS app
Related: architecture.md (W ecosystem), Mobile Auth And Workspace Resolution
Context
Two observations forced this decision:
- The web (
app.askthew.com) onboards a new product or project context via voice or W Card. The Wizard iOS app onboards via a W Card built from typed / spoken / photographed input. Both flows do the same job: capture the crux of the project and seed it. - A Google sign-in redirect bug on mobile sent the user to
app.askthew.com— a different product surface (the post-onboarding console) — instead of back into Wizard. This exposed that "product", "form factor", and "URL" were tangled, and that the onboarding flow was implemented twice without a shared contract.
We were treating Wizard as "the mobile app" and the web onboarding as a separate, unnamed flow. They are the same product.
Decision
Wizard is the platform's universal entrypoint — capture → W Card → seed project context — rendered on whatever surface the user is on. It is not a mobile app, and it is not separate from the web.
- The W Card is the canonical entrypoint artifact and the contract. Every onboarding surface produces the same W Card and calls the same seed/promote API.
- Capture engines are per-surface and intentionally different; their output is identical:
- Wizard-mobile → on-device Apple Intelligence (Foundation Models for six-W extraction; dictation; Vision OCR).
- Wizard-web → server voice / LLM + the W-Card form.
- The web's existing voice/W-Card onboarding is Wizard-web — it already exists; it must be factored out and named, not rebuilt.
Architecture
ONE onboarding capability (platform): capture → W Card → seed project context
│ shared: W Card schema · seed/promote API · flow shape · design language
├─ Wizard-mobile : capture engine = on-device Apple Intelligence (text · dictation · photo-OCR)
└─ Wizard-web : capture engine = server voice / LLM + W-Card form
↓
canonical W Card → /seed → project context
Consolidate: the W Card schema, the onboarding flow shape (capture → review → seed), the seed/promote endpoint, the design language. Keep surface-specific: the capture engine and the modalities offered (mobile on-device vs web server). We unify the output, not the engines.
What converges, what diverges
- Converge — at the entrypoint. Before project context exists, both surfaces run the same Wizard intake against the same W Card contract. "Fewer functionality on mobile" does not apply here: the entrypoint is identical.
- Diverge — after project context exists. Mobile Wizard stays capture-focused (keep capturing / quick edits); web graduates the user into the console (Why / operate). The console is the surface you graduate into, not what onboarding shows.
Routing & auth implication (and the bug fix)
Route by onboarding state, not by surface.
- Native Wizard auth →
askthew://auth-callback(stays in the app). Add it to the Supabase Redirect URLs allowlist so Supabase stops falling back to the Site URL. Never bounce native auth to a web product. - After mobile auth:
- no project context yet → stay in mobile Wizard intake.
- project context exists → show the mobile project view (scoped).
- Web mirrors this: onboarding state decides Wizard-intake vs console.
The redirect bug and the architectural error were the same mistake — sending the entrypoint to the destination.
Consequences
- Onboarding becomes a single platform capability with a stable contract; web and mobile can no longer drift into two different onboardings.
- Wizard-web ships as a factoring-out of existing flow, not a new build.
- Mobile's smaller surface is now correctly framed as scope-by-mode (capture vs operate), not feature-parity debt.
- Auth/landing is deterministic per surface and onboarding state.
Sequence
- Now: fix native auth to land in-app (Supabase redirect allowlist). Stops Wizard from ever showing the console.
- Now: define the onboarding contract — W Card schema + seed/promote flow + a "modality adapter" interface that both Wizard-web and Wizard-mobile implement.
- Soon: refactor web onboarding and mobile intake to both target that contract (two adapters, one flow).
- Later, only if needed: formalize a dedicated Wizard-web surface (route or subdomain) reusing the contract — a capture surface, not a console clone.
Open item
Author the onboarding contract spec (W Card schema · seed/promote API · modality-adapter interface) as the single artifact both surfaces implement. This is what makes "build it once, render per surface" real.