BowlerKitBowlerKit
Features

Deep Links

10/11/2026

Configure and test the Expo link entry point used by verification and password reset flows.

Current contract

The Expo config uses the exonlate custom scheme and the app route app/link.tsx as the allowlisted entry point:

exonlate://link?destination=reset-password&token=...&email=...

app/link.tsx accepts only these destinations:

  • destination=reset-password with a valid token and email.
  • destination=email-verified with no additional action parameters.

Unknown destinations, malformed email values, and unexpected parameters fall back to the login/home flow instead of being routed dynamically.

Password reset

The backend should generate a link that targets /link, not the reset screen directly:

exonlate://link?destination=reset-password&token=RESET_TOKEN&email=user%40example.com

The link entry point validates the parameters and then replaces the route with /(auth)/reset-password. The reset screen submits the token and email to the Account backend.

Email verification

Verification links use the same entry point:

exonlate://link?destination=email-verified

After the browser completes verification, the app refreshes the current user when authenticated and routes to the appropriate screen.

Native configuration

app.config.ts currently sets:

  • Scheme: exonlate
  • Android package: com.soewidiputra.exonlate.mobile
  • iOS bundle identifier: com.soewidiputra.exonlate.mobile

If you rename the app, update the scheme and native identifiers together, then regenerate native projects with pnpm prebuild:clean. The backend's generated reset/verification URLs must use the same scheme and /link contract.

Testing

Use a development build (not only Expo Go) for native scheme testing:

npx uri-scheme open \
  "exonlate://link?destination=reset-password&token=TEST_TOKEN&email=user%40example.com" \
  --android

npx uri-scheme open \
  "exonlate://link?destination=email-verified" \
  --ios

For browser-to-app HTTPS links, add platform Universal Links/App Links configuration separately. The template's built-in contract is the custom scheme above; hosting assetlinks.json or an Apple AASA file alone does not create that configuration.

Relevant files

  • app.config.ts — scheme and bundle identifiers.
  • app/link.tsx — validation and routing.
  • app/(auth)/reset-password.tsx — reset form.
  • services/endpoints.ts — Account auth endpoint paths.