Android Deep Link Debugging & Orchestration Tool
A desktop application for debugging Android App Links and Deep Links across devices, manifests, and on-device verification state.
Features • Installation • Usage • Contributing • License
- Auto-detect connected Android devices with OS version and SDK level
- Concurrent multi-device support with per-device serial routing
- Configurable polling cadence via Settings
- List installed packages and inspect every
<intent-filter>(App Links, Custom Schemes, HTTP) - Fire deep links straight to the device with one click and watch the response in the integrated log panel
- Export captured manifest data for sharing
- Validate
assetlinks.jsonhosted athttps://<domain>/.well-known/assetlinks.json - Surface common failure modes — missing file, invalid JSON, redirects, wrong Content-Type, network errors
- Inline guidance for fixing each issue
- Per-domain App Links verification state (
verified,legacy_failure,state_no_response, ...) - SHA-256 certificate fingerprint comparison between device and
assetlinks.json - Root-cause analyzer with actionable suggestions
- One-click Ktor server (bound to
127.0.0.1) that serves a generatedassetlinks.json - Extract the signing fingerprint from a connected device
- End-to-end workflow: start server → trigger
pm verify-app-links --re-verify→ poll for state changes → tear down
- Capture Bundle data from intents fired on a device
- Compare payload snapshots side-by-side to diff what changed between runs
- Interactive tree visualization of an app's URI structure (scheme → host → path)
- Find packages competing for the same custom scheme so chooser dialogs can be debugged
- Run a scenario file containing many URIs against a device
- Parameter substitution for templated URIs (
{{userId}}, etc.) - Import/export scenarios as JSON
- Stream filtered logcat for deep-link-related signals while testing
- Generate a QR code for any deep link to test from a physical phone without typing
- Save frequently used deep links and fire them with one click
- Theme (Light / Dark / System) applied instantly
- ADB binary override path
- Default host:port for Local Hosting
- Device detection polling interval
Cmd/Ctrl + R— refresh devicesCmd/Ctrl + F— focus searchEsc— close panel?— show all shortcuts
- Java 17 or higher
- Android device with USB debugging enabled (or an emulator)
- ADB is optional — LinkOps will download the official
platform-toolsautomatically if it isn't already on yourPATH
git clone https://github.com/manjees/link-ops.git
cd link-ops
./gradlew :composeApp:runFor faster iteration during UI work:
./gradlew :composeApp:runHotComing soon — see Releases.
Plug in your phone with USB debugging enabled. LinkOps polls ADB and surfaces the device on the Dashboard automatically.
Manifest → pick the device → search for the package → review every intent-filter with its verification status. Use Test to fire a deep link.
Diagnostics → enter your domain. LinkOps fetches assetlinks.json and tells you exactly what's wrong.
Deep Dive → pick the package. You'll see the device-reported state alongside the remote assetlinks.json and a fingerprint match check. The analyzer suggests fixes for each failure mode.
Local Host → extract the fingerprint from the device, preview the generated JSON, start the server, run the verification workflow. The Ktor server is 127.0.0.1-only (see #29 for the planned external-tunnel option that enables full on-device verification).
- Kotlin Multiplatform (JVM target) — single codebase, native desktop
- Compose Multiplatform Desktop + Material3 — declarative UI
- Clean Architecture —
data/domain/ui/infrastructure/di - Ktor — HTTP client (
assetlinks.jsonfetch) + embedded server (Local Hosting) - kotlinx.coroutines — structured concurrency,
StateFloweverywhere - kotlinx.serialization — settings, favorites, scenario import/export
- ZXing — QR code generation
composeApp/src/jvmMain/kotlin/com/manjee/linkops/
├── data/ # Repositories (impl), parsers, mappers, generators, analyzers, strategies
├── domain/ # Models, repository interfaces, use cases (no Android/JVM specifics)
├── infrastructure/ # ADB, network (Ktor client), server (Ktor server), QR
├── ui/ # Compose screens, reusable components, theme, navigation
└── di/ # AppContainer — manual wiring
Dependency direction is strictly ui → domain ← data ← infrastructure. All ADB calls go through AdbShellExecutor, all HTTP through AssetLinksClient, all local serving through AssetLinksServer.
Pull requests are welcome — see CONTRIBUTING.md for the full guide.
git clone https://github.com/YOUR_USERNAME/link-ops.git
git checkout -b feature/your-feature
./gradlew :composeApp:jvmTest
git push origin feature/your-feature- Manifest Analyzer
- AssetLinks Diagnostics
- Verification Deep Dive (fingerprint comparison + root cause)
- Local Hosting Simulation
- Intent Payload Sniffer
- Deep Link Topology Map
- Scheme Collision Detector
- Batch Deep Link Testing
- Real-time Logcat Streaming
- Magic QR Code Generator
- Deep Link Favorites
- Settings (theme, ADB override, hosting defaults, polling)
- Keyboard Shortcuts
- External HTTPS tunnel for Local Hosting (#29) — real on-device verification via ngrok / cloudflared
- iOS Universal Links support (#30) — Android/iOS pair debugging
- CLI / Headless mode + GitHub Action (#31) — CI/CD integration
- APK file analysis (#32) — verify builds without installing
- Multi-language UI (i18n)
- Pre-launch checklist
- Emulator matrix automation (Android 11–15)
This project is licensed under the Apache License 2.0 — see the LICENSE file for details.
Made with ❤️ for Android Developers