Quickstart
Create a Flinku project, wire Universal Links and App Links, install the SDK, and ship your first yourapp.flku.dev/… link.
Step 1: Create a project
- Go to app.flinku.dev.
- Click New Project.
- Enter your app name and subdomain (e.g.
yourapp→yourapp.flku.dev). - Enter iOS config: Bundle ID, Team ID, App Store URL.
- Enter Android config: Package name, SHA-256 fingerprint, Play Store URL.
- Click Create Project.
Step 2: Configure iOS (Universal Links)
- Open Xcode → your target → Signing & Capabilities.
- Click + Capability → Associated Domains.
- Add:
applinks:yourapp.flku.dev
This tells iOS that your app handles links from yourapp.flku.dev.
Step 3: Configure Android (App Links)
Add the following inside your main activity in AndroidManifest.xml:
<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" /><dataandroid:scheme="https"android:host="yourapp.flku.dev" /></intent-filter>
Step 4: Install the SDK
Flutter
dependencies:flinku_sdk: ^0.7.2
iOS (Swift Package Manager)
Repository: https://github.com/flinku-dev/ios-sdkTag: 0.7.1
Android (JitPack)
implementation 'com.github.flinku-dev:android-sdk:0.7.1'
Ensure the JitPack repository (https://jitpack.io) is included in your Gradle settings.
React Native
"dependencies": {"flinku-react-native": "^0.7.5"}
Unity (UPM git URL)
https://github.com/flinku-dev/unity-sdk.git#0.7.1
Capacitor
"dependencies": {"flinku-capacitor": "^0.7.5"}
Step 5: Initialize the SDK
Flutter
void main() async {WidgetsFlutterBinding.ensureInitialized();Flinku.configure(baseUrl: 'https://yourapp.flku.dev');runApp(MyApp());}
iOS
@mainstruct MyApp: App {init() {Flinku.configure(baseUrl: "https://yourapp.flku.dev")}}
Android
class MyApplication : Application() {override fun onCreate() {super.onCreate()Flinku.configure(this, baseUrl = "https://yourapp.flku.dev")}}
MyApplication in the manifest android:name if you initialize there.React Native
import { Flinku } from 'flinku-react-native';export const flinku = new Flinku({userId: 'unique-device-or-user-id',baseUrl: 'https://yourapp.flku.dev',apiKey: 'flk_pk_...',});
Capacitor
import { Flinku } from 'flinku-capacitor';export const flinku = new Flinku({userId: 'unique-device-or-user-id',baseUrl: 'https://yourapp.flku.dev',apiKey: 'flk_pk_...',});
Step 6: Handle deep links
Deep links use two different code paths. Do not treat match() as the handler for every open.
Path A — Installed user taps a link
The platform already delivers the URL via App Link, Universal Link, or URI scheme. Your app routes that URL.
- If you received a Flinku short URL (
https://yourapp.flku.dev/abc123), resolve it withGET /api/links/resolve/:slug?subdomain=...and navigate from the JSON (deepLink,params). - Do not call
match()for this path.
// Incoming App Link / Universal Link: https://yourapp.flku.dev/abc123final uri = Uri.parse(incomingUrl);final subdomain = uri.host.split('.').first;final slug = uri.pathSegments.isNotEmpty ? uri.pathSegments.first : null;if (slug == null) return;final res = await http.get(Uri.parse('https://flku.dev/api/links/resolve/$slug?subdomain=$subdomain'),);if (res.statusCode != 200) return;final data = jsonDecode(res.body) as Map<String, dynamic>;// Navigate using data['deepLink'] and data['params']
Path B — User installs after tapping
Call match() once on first launch (when there is no launch URL) to recover the deferred link from fingerprint and clipboard (all SDKs). Play Install Referrer gives deterministic matching on Android Play Store installs. It is available in the native Android SDK and in the Flutter prerelease 0.8.0-beta.1; stable Flutter (0.7.2) matches via fingerprint and clipboard only. See Troubleshooting for how to opt into the prerelease.
Flutter
// Only when the app was not opened by a direct App Link / Universal Link / URI schemefinal link = await Flinku.match();if (link != null && link.matched) {Navigator.pushNamed(context, link.deepLink!);}
iOS
let link = await Flinku.match()if link.matched {router.navigate(to: link.deepLink!)}
Wire router.navigate to your SwiftUI navigation or UIKit flow.
Android
lifecycleScope.launch {val link = Flinku.match(context)if (link.matched) {startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(link.deepLink)))}}
React Native / Capacitor
const link = await flinku.match();if (link?.deepLink) {// Navigate using your router}
These paths must stay separate. Path B must not overwrite a link already delivered by Path A. If a launch URL is present, route it (Path A) and skip match(). See Apps that already handle their own deep links.
Step 7: Create your first link
- Go to your project in the dashboard.
- Click Create Link.
- Enter title and deep link (e.g.
yourapp://home). - Optionally add params:
ref=instagram,promo=SAVE20. - Copy the short URL:
yourapp.flku.dev/abc123