agentsclimarketplace

Deep linking

Skill launch52-ai/flutter-template/.claude/skills/deep-linking

Deep linking with Universal Links (iOS) and App Links (Android). Platform setup, domain verification, GoRouter integration, path-based routing. Use when implementing deep links, URL handling, or app-to-web navigation.From its SKILL.md

Install
npx -y skills add launch52-ai/flutter-template --skill deep-linking

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 4 commands, including `xcrun simctl openurl booted "https://example.com/products/123"` and 3 more.
  • fetches URLsInstructs the agent to fetch 1 URL, including https://example.com/.well-known/apple-app-site-association.

SKILL.md

5.6 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

Deep Linking - Universal Links & App Links

Deep linking setup for iOS (Universal Links) and Android (App Links) with GoRouter integration.

When to Use This Skill

  • Adding deep link support to a Flutter app
  • Configuring Universal Links for iOS
  • Configuring App Links for Android
  • Handling custom URL schemes
  • Integrating deep links with GoRouter
  • User asks "add deep linking", "universal links", "app links", or "URL handling"

Questions to Ask

  1. Domain: What domain will host the deep links? (e.g., example.com)
  2. Paths: Which paths should open the app? (e.g., /products/*, /users/*)
  3. Custom scheme: Need a custom URL scheme fallback? (e.g., myapp://)
  4. Environments: Multiple domains? (e.g., staging.example.com, example.com)
  5. Backend access: Can you host .well-known files on the server?

Reference Files

  • reference/router/deep_link_handler.dart - GoRouter deep link config
  • templates/ios/Runner.entitlements - Associated Domains
  • templates/android/android_manifest_deeplinks.xml - Intent filters

See: implementation-guide.md for complete setup.

Workflow

Phase 1: Domain Verification

  1. Create apple-app-site-association file (see ios-guide.md)
  2. Create assetlinks.json file (see android-guide.md)
  3. Host files at https://domain.com/.well-known/
  4. Verify HTTPS and correct MIME types

Phase 2: iOS Configuration

  1. Add Associated Domains capability in Xcode
  2. Add domain to Runner.entitlements
  3. Handle links in AppDelegate (if needed)

Phase 3: Android Configuration

  1. Add intent filters to AndroidManifest.xml
  2. Set autoVerify="true" for App Links
  3. Generate and add SHA-256 fingerprint to assetlinks.json

Phase 4: GoRouter Integration

  1. Configure GoRouter with deep link paths
  2. Add route parameter extraction
  3. Handle unknown deep links gracefully
  4. Test with adb and xcrun commands

Core API

// GoRouter handles deep links automatically
GoRouter(routes: [
  GoRoute(path: '/products/:id', builder: (context, state) =>
    ProductScreen(productId: state.pathParameters['id']!)),
]);
// Manual: GoRouter.of(context).go(Uri.parse(deepLink).path);

URL Types

TypeiOSAndroidFormat
Universal/App LinksYesYeshttps://domain.com/path
Custom SchemeYesYesmyapp://path
Firebase Dynamic LinksDeprecatedDeprecatedUse Universal/App Links

Domain Verification Files

iOS: apple-app-site-association

Host at: https://domain.com/.well-known/apple-app-site-association

{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "TEAM_ID.com.example.app",
      "paths": ["/products/*", "/users/*"]
    }]
  }
}

Android: assetlinks.json

Host at: https://domain.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.app",
    "sha256_cert_fingerprints": ["SHA256_FINGERPRINT"]
  }
}]

Platform Requirements

iOS

  • Associated Domains capability enabled
  • HTTPS domain with valid certificate
  • apple-app-site-association file accessible (no redirects)
  • MIME type: application/json

Android

  • Intent filters with autoVerify="true"
  • SHA-256 fingerprints (debug, release, Play Store)
  • assetlinks.json file accessible
  • MIME type: application/json

Testing Commands

xcrun simctl openurl booted "https://example.com/products/123"  # iOS
adb shell am start -a android.intent.action.VIEW -d "https://example.com/products/123" com.example.app
adb shell pm get-app-links com.example.app                      # Verify Android
curl -I https://example.com/.well-known/apple-app-site-association

Guides

FileContent
ios-guide.mdUniversal Links, Associated Domains, AASA file
android-guide.mdApp Links, Intent Filters, Digital Asset Links
implementation-guide.mdGoRouter integration, path handling
checklist.mdVerification checklist

Common Issues

IssueCauseSolution
iOS link opens SafariAASA not foundCheck .well-known path and MIME type
Android shows app chooserautoVerify failedVerify assetlinks.json and SHA-256
Path not matchedWrong patternCheck path patterns in AASA/router
Works in dev, not prodWrong fingerprintAdd release/Play Store SHA-256

Checklist

  • Domain supports HTTPS with valid certificate
  • apple-app-site-association hosted at .well-known/
  • assetlinks.json hosted at .well-known/
  • iOS: Associated Domains capability added in Xcode
  • iOS: Domain added to Runner.entitlements
  • Android: Intent filters added to AndroidManifest.xml
  • Android: All SHA-256 fingerprints in assetlinks.json
  • GoRouter configured with deep link paths
  • Deep links tested on both platforms
  • Unknown paths handled gracefully

Related Skills

  • /core - GoRouter setup (run first)
  • /push-notifications - Deep links from notifications
  • /release - iOS capabilities, Android signing
  • /testing - Deep link integration tests

What ships with it: 9 files

41.8 KB alongside SKILL.md

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.