BowlerKitBowlerKit
Features

Deep Links

10/11/2026

Allowlisted custom-scheme links for Account actions and native navigation.

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.com

Use 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.scheme and DemoLinks.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.