Skip to content

[Feature Request] Android App Links (Verified Deep Links) Support #40

@binarymelon

Description

@binarymelon

Feature Request: Android App Links (Verified Deep Links) Support

Summary

Add support for Android App Links with autoVerify="true" so that navigating to a user's self-hosted Seerr instance in a browser or from another app automatically opens the Seerr mobile app without a disambiguation dialog.

Motivation

Currently the app only registers a seerr:// custom URI scheme for deep linking. While this works when links are explicitly crafted with that scheme, it means:

  • Navigating to https://my-seerr-instance.example.com in a browser never offers to open the app
  • Sharing standard https:// links to Seerr content won't route to the app
  • The user experience is inconsistent compared to apps like Jellyfin, Plex, etc. that intercept their server's URLs natively

Current Behaviour

The AndroidManifest.xml contains an https intent filter (line 20) but it has no android:host constraint and no android:autoVerify="true" attribute, so Android does not treat it as a verified App Link:

<!-- Current: unverified, no host binding -->
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" />
</intent-filter>

Proposed Change

Add a verified App Links intent filter to the Expo config (app.json or app.config.js):

{
  "android": {
    "intentFilters": [
      {
        "action": "VIEW",
        "autoVerify": true,
        "data": [
          {
            "scheme": "https"
          }
        ],
        "category": ["BROWSABLE", "DEFAULT"]
      }
    ]
  }
}

This generates the following in AndroidManifest.xml after expo prebuild:

<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" />
</intent-filter>

Instance-Side Configuration

Self-hosters would opt in by placing an assetlinks.json at /.well-known/assetlinks.json on their instance:

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "dev.seerr.mobileapp",
      "sha256_cert_fingerprints": [
        "<SHA256_OF_RELEASE_SIGNING_CERT>"
      ]
    }
  }
]

The release signing certificate's SHA-256 fingerprint should be documented so instance operators can configure this correctly.

References

DISCLAIMER: The above was generated with the help of Claude Desktop.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions