Ship a Midnight dApp as a native Android app.
Kuira Labs' open-source Android SDK bundles passkey-derived identity, an embedded wallet, and the Compact contract runtime into a single Gradle dependency. No Lace, no browser extension, no seed phrase — biometric unlock and a normal app-store install.
The desktop-only ceiling, lifted.
Ship to any Android user
Lace is a browser extension — a large UX filter for non-crypto-native users. Kuira ships as an app: install from the Play Store, open, use. Instantly reachable by the ~3B active Android devices.
Biometrics instead of seed phrases
Identity derives from a WebAuthn/passkey stored in the device secure enclave. Unlock with fingerprint or face — no 24 words to lose, no phishable private key on disk.
Wallet + proving + Compact runtime
Signing, tDUST balance handling, ZK proving hooks, and Compact circuit calls all ship in the SDK. You write app UI; the SDK talks to indexer, proof server, and node.
Categories desktop can't reach
NFC tap-to-anchor, POS receipts, offline-first field capture, wearable check-ins, mobile-only crowdfunding. Verticals gated behind a phone form-factor open up.
1,000 mobile-flavoured mega-prompts.
Every idea on the site now has a fifth Undeployed (Mobile) tab — a Kotlin + Jetpack Compose starting scaffold for the Kuira Android SDK. Lovable won't build the APK; you'll paste the output into Cursor or Android Studio to finish.
mobilemidnight — Tokenized Choreo Kits.
The first verified end-to-end Kuira dApp on Undeployed: passkey Sigil forge, 10,000 NIGHT airdrop, dust registered, catalog deployed, and two kits published on-chain with a ~25s warm on-device prove.
0.1.0-alpha05 · Compact 0.31.1 · mn localnet · on-device proving- Passkey Sigil forge (WebAuthn / Credential Manager)
- NIGHT funded via
mn airdrop … --network undeployed - Dust registered in-app (not via
mn dust register) - Compact catalog deployed, 2 kits published (~25s warm prove)

0.1.0-alpha05Midnight Undeployed · ~25.8s wall time / publish
Every hard-won lesson from this build — passkey rpId + assetlinks, emulator prerequisites, `mn airdrop` funding path, address-checksum pitfalls, `FLAG_SECURE` screencap workarounds — is folded into the Lovable Midnight skill you can download for your own Lovable projects.
Builds that only make sense on mobile.
Tap-to-anchor choreography
Dancer taps phone on a stage NFC tag → on-device ZK proof commits the move to a Compact ledger. Judges scan the tag to verify authorship without exposing the routine.
Offline-first receipts
Field workers capture provenance without connectivity. The SDK queues signed intents; when online, it batch-submits ZK proofs to Midnight. Perfect for photojournalism, expedition logs, or supply-chain provenance.
Passkey agent wallets
Give an on-device A2A / AP2 / UCP / x402 agent its own passkey-scoped wallet. Micro-payments and CartMandate anchoring settle on Midnight without ever seeing a seed phrase.
Mobile-first crowdfunding
ChoreoCrowd-style campaigns where backers contribute tDUST from a phone. In-app faucet button (same pattern as flymidnight) means first-time users can try the flow with zero external setup.
Same primitives, new client.
The mobile SDK slots into the same Midnight infrastructure the web demos already use — you don't rebuild anything server-side, you just add a second client.
mn airdrop … --network undeployed + in-app "Register dust"Three steps to a first build.
- 01
Start the Kuira-native local devnet
Kuira targets the
mnCLI toolchain, not the Dockermidnight-node:0.22.5stack the web demos use. Runmn localnet upto bring up an Undeployed devnet the SDK understands natively. (You can still point Kuira at a Fly.io-hosted indexer + proof server if you'd rather not run a devnet on your laptop — Fly.io recipe →) - 02
Add the Kuira Gradle dependency
Follow the SDK README to add the dependency, initialise the passkey identity, and wire the embedded wallet. The Kuira docs walk through the minimal Android Studio project. SDK README ↗
- 03
Fund the Sigil with mn airdrop, then Register dust in-app
There is no in-app browser faucet on mobile. Forge the passkey Sigil, copy the
mn_addr_undeployed1…address from the app UI (do NOT retype from a screenshot —l/1collisions break the checksum), then:
Then tap Register dust in the app (NOTmn airdrop 10000 --wallet <addr> --network undeployedmn dust register— Kuira uses its own registration flow). Now Deploy the catalog and Publish a kit; expect ~30–120s cold on-device prove.
Skip any of these and you'll spend hours in Credential Manager exceptions.
- Real domain
rpId— notREPLACE_ME, not.example. GitHub Pages works (e.g.arunnadarasa.github.io). - Hosted
assetlinks.jsonathttps://<rpId>/.well-known/assetlinks.jsonwith your Android package + debug (or release) signing SHA-256. - Signed-in Google account on the AVD or device — passkey create has no options without it, DAL correctness alone is not enough.
- Screen lock set — biometric/PIN. Password Manager refuses to offer create otherwise.
- Soft keyboard forced on:
adb shell settings put secure show_ime_with_hard_keyboard 1+ Gboard. Host-keyboard input silently fails on Compose and WebView fields. - After any
rpId/assetlinks change: full uninstall then reinstall.adb install -rleaves Credential Manager cached.
Where to dig deeper.
Source, issue tracker, and the canonical README with Gradle instructions.
Docs siteHosted API reference and guides for identity, wallet, and contract calls.
Reference buildTokenized Choreo Kits — first verified Kuira dApp on Undeployed. Passkey Sigil, mn airdrop funding, on-device prove, 2 kits published.
mobilemidnight is the reference repo; the first team to ship a hosted Kuira demo gets featured on the showcase page.
InfrastructureHow to run the node, indexer, and proof server locally or on Fly.io so your Android app has something to talk to.
Kuira SDK was surfaced by Jay Albert (Midnight Network) in the #dev-chat Discord as the recommended path for hackathon teams building mobile Midnight dApps.