skills/mobile-deep-linking-specialist/SKILL.md
Mobile deep linking specialist for Universal Links, App Links, deferred deep links, and attribution. Activate on: deep linking, Universal Links, App Links, deferred deep link, app attribution, URL scheme, branch.io, dynamic links, app clip. NOT for: web routing (use frontend-architect), push notification handling (use mobile-push-notification-expert), API URL design (use api-architect).
npx skillsauth add curiositech/windags-skills mobile-deep-linking-specialistInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in implementing deep linking across iOS and Android with Universal Links, App Links, deferred deep links, and attribution tracking.
Input: App requirements and constraints
├─ Simple link tracking + basic install attribution?
│ └─ YES → Use Branch.io (quick setup, free tier)
│ └─ NO → Continue
├─ Enterprise with complex attribution models?
│ └─ YES → Use Adjust or AppsFlyer (advanced features)
│ └─ NO → Continue
├─ Privacy-first, minimal data collection?
│ └─ YES → Custom solution with SKAdNetwork only
│ └─ NO → Use Branch.io
Target Platform Analysis:
├─ iOS 14+ with ATT restrictions?
│ ├─ HIGH privacy users → Clipboard method (user consent required)
│ └─ LOW privacy users → Fingerprint method (limited accuracy)
├─ Android with Play Install Referrer API?
│ └─ Use Play Install Referrer (most reliable)
├─ Cross-platform consistency needed?
│ └─ Use Branch.io or Adjust SDK (abstracts platform differences)
App State When Link Clicked:
├─ App not installed?
│ ├─ Marketing campaign → Smart app banner + deferred deep link
│ └─ User sharing → Direct app store link with custom params
├─ App installed but closed?
│ ├─ Universal/App Link configured → Direct app open
│ └─ No Universal Links → Custom URL scheme with fallback
├─ App running in background?
│ └─ Use Linking.addEventListener for immediate navigation
Scenario: User receives SMS link to product, app not installed
Link Analysis: https://shop.example.com/product/nike-air-max
Attribution Choice Decision:
Requirements: Track SMS campaign performance + deferred deep links
Privacy constraints: Moderate (e-commerce, some user tolerance)
→ Decision: Branch.io (good SMS attribution + easy deferred setup)
Implementation Trade-offs:
Setup Walkthrough:
// 1. AASA file includes Branch domains
"applinks": {
"details": [{
"appIDs": ["TEAMID.com.shop.example"],
"components": [
{ "/": "/product/*" },
{ "/": "https://shop.app.link/*" } // Branch domain
]
}]
}
// 2. Navigation config with deferred handling
const linking = {
prefixes: ['https://shop.example.com', 'https://shop.app.link'],
config: { screens: { Product: 'product/:id' } },
async getInitialURL() {
const branchData = await branch.getFirstReferringParams();
if (branchData?.'+clicked_branch_link') {
return `https://shop.example.com${branchData.$deeplink_path}`;
}
return await Linking.getInitialURL();
}
};
Expert Optimization: Pre-load product data during app install to reduce perceived navigation delay
adb shell am start -W -a android.intent.action.VIEW -d "https://example.com/test"frontend-architect for SPA routingmobile-push-notification-expert for notification processingapi-architect for REST/GraphQL URL structuremobile-app-store-expert for app submission settingsauth-specialist for login redirect handlingdata-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.