Deep link tester
Paste a link to get adb, Simulator and intent:// commands that survive your shell, a QR code to scan, and a check of which intent filter catches it.
- Android and iOS
- Free, no sign-up
Runs in your browser. The link, package name and pasted manifest stay in this tab; nothing is fetched or sent.
Type or paste a link to build the commands.
Android (adb)
As if tapped in a browser
Android picks the app, so this shows what users get: your app, a chooser, or the browser.
Straight to your app
Adds the package name, so only your app can answer. Use it to test the screen the link opens.
Why did it open there? (Android 17 and later)
iOS Simulator
Chrome on Android (intent://)
QR code
Scan it with the phone's camera to open the link the way a user would.
Does your app match this link?
A model of Android's and Apple's documented matching rules, not a device test. Confirm with the commands above.
Runs in your browser. Nothing you type or open is uploaded. Free to use, no account. More Android developer tools
How to test a deep link
- Paste the link, add your app's package name, and pick the shell you'll paste the command into.
- With a device or emulator connected (
adb deviceslists it), run the tapped-link command. A verified App Link opens your app with no chooser. - Run the command with the package name to check the screen your app shows for that link.
- On a Mac, run the Simulator command with an app installed in the booted Simulator, or scan the QR code with a real iPhone or Android phone.
- Paste your intent filters (or the whole manifest) to see which filter catches the link, and which line fails when none does.
Why the quoting matters
A deep link usually has characters that shells treat as commands: & runs the rest in the background, ? and * expand file names, ; ends the command and $ starts a variable. And the link passes through two shells: yours, then the device's shell that adb shell hands the command to. Android's own docs warn that a query string with & needs escaping. Pasted unquoted, myapp://open?id=1&tab=2 reaches the app as myapp://open?id=1.
This page wraps the command for the shell you pick: single quotes around the whole command for bash and zsh, with the link in double quotes inside; double quotes for PowerShell and cmd, with the link in single quotes for the device. PowerShell gets a backtick before $. Spaces, quotes and non-ASCII letters in the link are percent-encoded first, because a URI can't contain them.
How Android matches an intent filter
- The filter needs the
VIEWaction and theDEFAULTcategory. Links tapped in a browser or another app also needBROWSABLE. - Every
<data>element in one filter is merged: each scheme combines with each host and each path. Two unrelated URL shapes belong in two filters. - The scheme must match exactly, and is case-sensitive. Hosts ignore case;
*.example.commatches subdomains but notexample.comitself. - Without a host, paths are ignored. Without path attributes, any path matches.
pathis exact,pathPrefixis a prefix, andpathSuffixandpathAdvancedPatternneed Android 12 or later. pathPatternis a simple glob, not a regular expression:.is any character,*repeats the character before it, and.*stops at the first occurrence of the next character without backtracking. Write\\in XML to escape a character.- Paths are compared after percent-decoding, so
%20in the link matches a space in the filter.
intent:// links in Chrome
Chrome on Android opens an app from a web page with an intent:// link. The part before #Intent is your link without its scheme, followed by scheme=, an optional package= and an optional S.browser_fallback_url that Chrome opens when no app can handle it. Values after #Intent are decoded once, so the fallback is percent-encoded here. Chrome only launches activities whose filters include BROWSABLE. The button above works when this page is open in Chrome on an Android phone.
iOS universal links and custom schemes
xcrun simctl openurl booted opens a URL in the booted Simulator as if the system had received it, for both custom schemes and https links. A universal link opens your app only if the app's Associated Domains entitlement lists the domain and the site's apple-app-site-association file matches the path; paste the file above to see which rule decides. Typing a link into Safari's address bar never opens an app.
Private by design
Privacy
Everything on this page runs in your browser tab. The link, package name, manifest and AASA file you paste aren't uploaded, and only the shell choice and the browsable tick are kept in the page address. The QR code is drawn in the tab.
This page also shows Google ads, which can use cookies. Privacy and cookies explains how.
Link to this tool
Found it useful? You're welcome to link to it from your README, docs or blog.
Questions
How do I test a deep link with adb?
Connect a device or start an emulator, then run adb shell am start -W -a android.intent.action.VIEW -d with the link in quotes, optionally followed by your package name. Add -c android.intent.category.BROWSABLE to test the way a tapped link resolves. This page writes the command with quoting that suits your shell.
Why does my link lose everything after &?
The shell read & as a command separator. The link passes through your shell and then the device's shell, so it has to be quoted for both. Copy the command from this page instead of typing the link bare.
Why does my deep link open the browser instead of my app?
For https links, Android 12 and later open unverified links in the browser, so check assetlinks.json and autoVerify. For any link, the intent filter may be missing BROWSABLE or DEFAULT, use another scheme or host, or have a pathPattern that doesn't match. Paste the filter here to find the failing line.
Can I test a universal link on the iOS Simulator?
Yes. xcrun simctl openurl booted with the https link opens it in the booted Simulator. The app must be installed there with the Associated Domains entitlement, and the AASA file must match the path.
What is an intent:// URL?
It is Chrome's way to launch an Android app from a web page: intent://, your link without its scheme, then #Intent;scheme=…;package=…;end. S.browser_fallback_url sends people to a web page when the app isn't installed.
From the same developer
- AASA validator: check the apple-app-site-association file behind universal links.
- Push notification tester: build APNs and FCM payloads that carry a deep link.