Deep Links
Allowlisted custom-scheme links for Account actions and native navigation.
Account links
The default custom scheme is bowlerkit-kmp. parseAccountLink in AccountLinks.kt recognizes the link host and an allowlisted destination:
bowlerkit-kmp://link?destination=email-verified
bowlerkit-kmp://link?destination=reset-password&token=RESET_TOKEN&email=user%40example.comUse these as contract examples; replace the placeholder reset token with one issued by your backend. A reset link requires exactly one destination, one nonblank token, and one valid email, with no extra query keys. Duplicate required parameters, fragments, malformed encoding, and unsupported destinations are rejected. Guest rejects Account links.
AppNavigation passes reset credentials to the reset screen, then clears them when consumed. Email verification opens Home and requests a user refresh. Account navigation still checks authentication before entering protected pages. Never log URLs containing reset credentials.
Native registration
Paths below are relative to mobile-app/:
- Android scheme/host filters:
androidApp/src/main/AndroidManifest.xml. - iOS custom scheme:
iosApp/iosApp/Info.plist(CFBundleURLTypes). - Shared scheme and route allowlist:
sharedLogic/src/commonMain/kotlin/com/soewidiputra/kmponlate/AppNavigation.kt(DemoLinks.schemeandDemoLinks.prefix). - Account parsing:
sharedLogic/src/commonMain/kotlin/com/soewidiputra/kmponlate/AccountLinks.kt.
Use bowler setup to change the scheme, then align the backend email links with that scheme. The template implements a custom URL scheme; do not assume HTTPS Universal Links or Android verified App Links are configured.
Demo navigation
parseDemoLink recognizes a closed route list under bowlerkit-kmp://demo/, such as home, settings, and billing. It accepts no query arguments. Developer scaffold routes such as counter and todo are enabled only when AppNavigation allows demo routes; release defaults close those scaffold routes.
Test cold and warm launches on both platforms, valid password resets, email verification, malformed/duplicate parameters, signed-out protected navigation, and Guest rejection. Notification payloads are not permission to navigate to an arbitrary URL.
