Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
ahmed3elshaer avatar

Deep Linking

  • 20 installs
  • 60 repo stars
  • Updated June 14, 2026
  • ahmed3elshaer/everything-claude-code-mobile

deep-linking is a Claude Code skill providing Android App Links and iOS Universal Links patterns for routing URLs to in-app screens.

About

deep-linking is a Claude Code skill with mobile deep-linking patterns for Android and iOS. A developer uses it to design a URI scheme and wire up intent filters, App Links, Universal Links, and the verification files that make HTTPS links open the app. It also covers Compose Navigation deep links and deferred deep links for install attribution.

  • URI scheme design plus Android App Links and iOS Universal Links setup
  • assetlinks.json and apple-app-site-association verification files
  • Compose Navigation deep-link integration and deferred deep links

Deep Linking by the numbers

  • 20 all-time installs (skills.sh)
  • Ranked #761 of 1,039 Mobile Development skills by installs in the Skillselion catalog
  • Data as of Aug 4, 2026 (Skillselion catalog sync)
At a glance

deep-linking capabilities & compatibility

Capabilities
deep linking · app links · universal links · navigation integration
Works with
github
Use cases
frontend
From the docs

What deep-linking says it does

Deep linking patterns for mobile - Android App Links, iOS Universal Links, intent filters, URI handling, deferred deep links, and navigation integration.
SKILL.md
Use Firebase Dynamic Links or AppsFlyer for deferred deep links that survive app install:
SKILL.md
npx skills add https://github.com/ahmed3elshaer/everything-claude-code-mobile --skill deep-linking

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs20
repo stars60
Last updatedJune 14, 2026
Repositoryahmed3elshaer/everything-claude-code-mobile

What it does

Wire up Android App Links and iOS Universal Links so URLs open the correct in-app screen.

Who is it for?

Mobile developers implementing deep links and URL routing on Android and iOS

When should I use this skill?

You need URLs to open specific screens in an Android or iOS app

By the numbers

  • Covers Android and iOS deep-link paths
  • Includes assetlinks.json and apple-app-site-association templates

Files

SKILL.mdMarkdownGitHub ↗

Deep Linking Patterns for Mobile

URI Scheme Design

Design a consistent URI scheme before implementation:

myapp://                          # App root
myapp://home                      # Home screen
myapp://product/{id}              # Product detail
myapp://profile/{userId}          # User profile
myapp://settings/notifications    # Nested settings
myapp://search?q={query}          # Query parameters

Keep paths RESTful, lowercase, and predictable. Use path segments for hierarchy and query params for filters.

---

Android

Intent Filter in AndroidManifest.xml

<activity
    android:name=".MainActivity"
    android:exported="true">

    <!-- Custom URI scheme -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="myapp"
            android:host="product"
            android:pathPrefix="/" />
    </intent-filter>

    <!-- App Links (HTTPS verified) -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="https"
            android:host="www.myapp.com"
            android:pathPrefix="/product" />
    </intent-filter>
</activity>

App Links with assetlinks.json

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

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.myapp.android",
    "sha256_cert_fingerprints": [
      "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
    ]
  }
}]

Get your certificate fingerprint:

keytool -list -v -keystore my-release-key.keystore -alias my-key-alias

Handling Deep Links in Activity

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handleDeepLink(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleDeepLink(intent)
    }

    private fun handleDeepLink(intent: Intent) {
        val uri = intent.data ?: return
        val path = uri.path ?: return
        val segments = path.split("/").filter { it.isNotEmpty() }

        when {
            segments.firstOrNull() == "product" -> {
                val productId = segments.getOrNull(1)
                navigateToProduct(productId)
            }
            segments.firstOrNull() == "profile" -> {
                val userId = segments.getOrNull(1)
                navigateToProfile(userId)
            }
        }
    }
}

Compose Navigation Deep Link Integration

NavHost(navController, startDestination = "home") {
    composable(
        route = "product/{productId}",
        arguments = listOf(navArgument("productId") { type = NavType.StringType }),
        deepLinks = listOf(
            navDeepLink { uriPattern = "myapp://product/{productId}" },
            navDeepLink { uriPattern = "https://www.myapp.com/product/{productId}" }
        )
    ) { backStackEntry ->
        val productId = backStackEntry.arguments?.getString("productId")
        ProductScreen(productId = productId)
    }
}

Deferred Deep Links (Install Attribution)

Use Firebase Dynamic Links or AppsFlyer for deferred deep links that survive app install:

Firebase.dynamicLinks
    .getDynamicLink(intent)
    .addOnSuccessListener { pendingDynamicLinkData ->
        val deepLink: Uri? = pendingDynamicLinkData?.link
        deepLink?.let { handleDeepLink(it) }
    }

---

iOS

Universal Links with apple-app-site-association

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

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAMID.com.myapp.ios",
        "paths": ["/product/*", "/profile/*", "/settings/*"]
      }
    ]
  }
}

Enable Associated Domains in Xcode: applinks:www.myapp.com

URL Schemes in Info.plist

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
        <key>CFBundleURLName</key>
        <string>com.myapp.ios</string>
    </dict>
</array>

Handling in AppDelegate / SceneDelegate

// SceneDelegate (iOS 13+)
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else { return }
    DeepLinkRouter.shared.handle(url: url)
}

// Universal Links
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard let url = userActivity.webpageURL else { return }
    DeepLinkRouter.shared.handle(url: url)
}

SwiftUI .onOpenURL

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    DeepLinkRouter.shared.handle(url: url)
                }
        }
    }
}

---

Deep Link Routing Architecture

// iOS Router
final class DeepLinkRouter: ObservableObject {
    static let shared = DeepLinkRouter()
    @Published var destination: Destination?

    enum Destination: Equatable {
        case product(id: String)
        case profile(userId: String)
        case settings
    }

    func handle(url: URL) {
        guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { return }
        let pathSegments = components.path.split(separator: "/").map(String.init)

        switch pathSegments.first {
        case "product":
            destination = .product(id: pathSegments[safe: 1] ?? "")
        case "profile":
            destination = .profile(userId: pathSegments[safe: 1] ?? "")
        default:
            break
        }
    }
}

---

Testing Deep Links

# Android - test custom scheme
adb shell am start -a android.intent.action.VIEW -d "myapp://product/123"

# Android - test App Links
adb shell am start -a android.intent.action.VIEW -d "https://www.myapp.com/product/123"

# iOS Simulator - test URL scheme
xcrun simctl openurl booted "myapp://product/123"

# iOS Simulator - test Universal Link
xcrun simctl openurl booted "https://www.myapp.com/product/123"

Analytics Tracking for Deep Links

Track deep link opens with source attribution:

fun trackDeepLinkOpen(uri: Uri, source: String) {
    analytics.logEvent("deep_link_opened") {
        param("uri", uri.toString())
        param("source", source) // "notification", "email", "social", "qr_code"
        param("path", uri.path ?: "")
        param("has_referrer", (uri.getQueryParameter("ref") != null).toString())
    }
}

Related skills

FAQ

Does it cover both platforms?

Yes. It includes Android intent filters and assetlinks.json plus iOS Universal Links and apple-app-site-association.

Are deferred deep links covered?

Yes. It shows Firebase Dynamic Links and AppsFlyer for deep links that survive app install.

Mobile Developmentfrontendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.