Deep Links
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-passwordwith a validtokenandemail.destination=email-verifiedwith 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.comThe 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-verifiedAfter 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" \
--iosFor 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.
