Skip to main content

What It Does

Connects web URLs to mobile app screens via both custom scheme (recipe-room://) and universal links (https://reciperoom.io/).
TypePatternExamples
Custom schemerecipe-room://recipe-room://recipe/{id}, recipe-room://post/{id}, recipe-room://collection/{id}, recipe-room://profile/{username}, recipe-room://search?q={query}
Universal linkshttps://reciperoom.io/https://reciperoom.io/recipes/{id}, https://reciperoom.io/posts/{id}, https://reciperoom.io/collections/{id}, https://reciperoom.io/profile/{username}

Mobile Implementation

  • src/utils/deepLinking.ts — handles URL parsing and navigation for both schemes
  • Integrated in root _layout.tsx — waits for splash screen to finish before processing
  • Uses Expo Linking API for URL handling

Apple App Site Association (AASA)

apps/web-interim/src/app/.well-known/apple-app-site-association/route.ts serves the AASA file for iOS universal links:
  • Returns JSON with applinks.details[].appIDs and applinks.components[]
  • Paths: /recipes/*, /posts/*, /collections/*, /profile/*
  • Team ID and Bundle ID configured for the production app
apps/web-interim/src/app/.well-known/assetlinks.json/route.ts serves the Android Asset Links file.
The SHA256 certificate fingerprint is still a placeholder (YOUR_SHA256_FINGERPRINT). This needs to be replaced with the actual signing key fingerprint before Android App Links will work. Get it via eas credentials --platform android or from Google Play Console.

Content Redirect Pages (Web Interim)

Content redirect pages exist for /recipes/[id], /posts/[id], /collections/[id]:
  • Attempt to deep-link into the mobile app first
  • If app isn’t installed, show “app only” fallback with waitlist signup
  • Uses the AppOnlyContent component
The AASA file supports /recipes/*, /posts/*, /collections/*, /profile/*. Mobile deepLinking.ts also handles /search?q=... via custom scheme — not a conflict since search uses recipe-room:// rather than universal links.