This is the biggest behavioral change in the migration. In the React SDK, SyncAuthFlow ran automatically after authentication and chained every remaining setup step for you. The JavaScript SDK does none of this — you decide which steps to run, detect what’s pending, and render each screen.
What SyncAuthFlow did
After a user authenticated, SyncAuthFlow silently orchestrated, in order:
- Onboarding / required-field collection
- Captcha (when enabled)
- MFA enrollment
- Device registration
- Embedded wallet creation
You never called these — the widget detected what was missing (useSyncOnboardingFlow watched userWithMissingInfo.missingFields, useSyncMfaFlow watched MFA state, etc.) and pushed the matching view.
What you own now
There is no automatic orchestration. After auth resolves, you run the chain yourself: check each step, show UI for whatever is pending, and let the user in once everything is done.
Each legacy sync hook maps to a detection call you make explicitly:
Do not gate access on a single “onboarding complete” flag. Compose the per-step checks above so you control exactly which steps block entry.
The orchestration pattern
Only handle the steps that apply to your app. Every step below is independent and optional — if your app doesn’t use MFA, skip the MFA check; if it has no embedded wallets, skip wallet creation; and so on. Compose only the checks for the features you’ve actually enabled, in the order that fits your flow. The show* functions below are your UI — the SDK owns the logic, you own the screens.
The complete implementation — every step’s UI, recovery-code acknowledgment, device registration, and lazy wallet creation — is in Post-login user setup.
See also