Four sample apps (Android, iOS, Flutter and React Native with Expo) that integrate the Smile ID v12 SDKs exactly the way a partner does. Every app resolves its SDK from the public registry (Maven Central, Swift Package Manager, pub.dev, npm), never from a local checkout.
That constraint is the point. It makes these apps both the reference integration partners copy and a test of what we publish: a defect that exists only in the published SDK, such as a missing dependency, a file absent from the package, or a keep rule that fails only under minification, shows up here first.
The Android and iOS apps are both published as Smile ID: iOS on the App Store, Android on Google Play and on Huawei AppGallery for Huawei phones.
- Every v12 product: SmartSelfie™ Enrollment and Authentication, Biometric KYC, Document Verification, Enhanced Document Verification, Residency Document Verification and Enhanced KYC, each composed with the flow builder.
- Token sessions: link the app to a real account by scanning or pasting a v3 token, with no API key in the app. When the token already carries the user's details and consent, the app skips those steps.
- Verifications: every submitted job, stored on the device, with its status refreshed from
GET /v3/status. - Profiles for different partners or test users, and an appearance (System, Light or Dark) carried through to the SDK's screens.
- Languages: English, French, Arabic and Hebrew, for the app and the SDK's screens. The app follows the device's language, or one picked in Settings.
- Probes for automation and debugging: a scenario drawer, an on-screen result card and callback counters.
Runs go to the Smile ID sandbox unless a linked token names production. Simulate a successful scan on the scan sheet reaches every screen without a real token.
Adding Smile ID makes an app this much bigger to download, for SDK 12.2.0:
| Your app is built with | Selfie only | Selfie and documents |
|---|---|---|
| Android (Kotlin) | +2.9 MB | +9.9 MB |
| iOS (Swift) | +4.3 MB | +4.3 MB |
| Flutter, on Android | +3.6 MB | +11.0 MB |
| Flutter, on iOS | +3.2 MB | +3.6 MB |
| React Native (Expo), on Android | +8.1 MB | +15.2 MB |
| React Native (Expo), on iOS | +8.6 MB | +8.7 MB |
"Selfie only" covers SmartSelfie™ and Biometric KYC. "Selfie and documents" adds document capture, which every document product needs.
These figures are what a user's phone downloads from the store. App size has the space each takes once installed, these apps' own sizes for comparison, and how they are measured.
| Platform | Needs |
|---|---|
| Android | JDK 21 or newer, and an Android SDK with API 37 |
| iOS | Xcode 27.1, and XcodeGen |
| Flutter | The Flutter stable channel |
| Expo | Node 20.19 or newer, and pnpm 9 |
cd android
./gradlew installPlayDebug # or installAppgalleryDebug: adds Huawei's HMS analyzers, picked per device
adb shell am start -a android.intent.action.VIEW -d "usesmileid-sample-android://products"In debug builds, Settings → Network logs opens the app's and the SDK's requests from the last hour, in Chucker, with credential headers redacted.
cd ios/App && xcodegen generate && open UseSmileIDSample.xcodeprojThe Xcode project is generated from ios/App/project.yml and is not committed. In debug builds, shake
the device to read the app's own network traffic, with credentials redacted.
cd flutter/app && flutter runcd expo && pnpm install
cd app && pnpm prebuild && pnpm android # or: pnpm iosThe Expo app needs react-native-worklets/plugin as the last Babel plugin
(expo/app/babel.config.js), or capture does not run.
Every route in spec/routes.json opens by deep link on each app's URL scheme:
usesmileid-sample-android://, usesmileid-sample-ios://, usesmileid-sample-flutter:// and
usesmileid-sample-expo://.
Each platform has one script that is its definition of done, and CI runs the same script on every pull request:
android/verify.sh
ios/verify.sh
flutter/verify.sh
expo/verify.sh| Guide | Answers |
|---|---|
| Architecture | How the four apps are built and kept identical, and where the SDK is called |
| Token sessions | How to run verifications from a v3 token instead of an API key |
| Theming | How the apps theme themselves and the SDK |
| Localisation | How the apps are translated, and how to add a language |
| Testing | How to test an integration like this one |
| App size | What Smile ID adds to an app's size, on each platform |
| Submitting to the stores | What the SDK means for your App Store and Google Play submission |
| Releasing | How these apps reach the stores |
| Backlog | Known gaps, if you want to contribute |
The SDK reference is at docs.smileidentity.com.
| Path | What lives there |
|---|---|
spec/ |
The cross-app contract as data: scenarios, routes, launch arguments, result-card fields, test ids, design tokens |
android/ |
The Android app (app/) and its sample-ui library |
ios/ |
The iOS app (App/) and the SampleUI Swift package |
flutter/ |
The Flutter app (app/) and the sample_ui package |
expo/ |
The Expo app (app/) and the sample-ui TypeScript package |
Each platform splits into a thin app shell (the SDK dependency, native configuration and flow host)
and a sample-ui library holding every screen a partner sees. AGENTS.md is the full
contributor guide, for people and coding agents alike.
See CONTRIBUTING.md. Report security problems privately, as SECURITY.md describes, never in a public issue. Never commit a token, partner id or API key.
The code is MIT-licensed (LICENSE). Bundled fonts, icons and Smile ID marks keep their own terms (NOTICE).
