Mobile · Kuira SDK

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.

What's the opportunity?

The desktop-only ceiling, lifted.

No extension

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.

Passkey identity

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.

One Gradle dep

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.

New hackathon lanes

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.

ExperimentalAndroid only

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.

Verified reference build

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.

Pinned stack
Kuira SDK 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)
Repo ↗
mobilemidnight Android emulator — Tokenized Choreo Kits demo running on Midnight Undeployed
Android emulator · Kuira 0.1.0-alpha05
Midnight 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.

Hackathon angles

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.

How it fits the existing stack

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.

Lace browser extension
Kuira embedded wallet (passkey-derived)
Browser proof-server fetch
On-device proving or Fly.io HTTPS proof server
scripts/deploy-midnight.mjs
Same script — Android reads VITE_DEFAULT_CONTRACT from a config endpoint
Local Docker Undeployed stack
Same stack — phone points at LAN IP (or Fly URL) instead of localhost
Indexer GraphQL over WSS
Same endpoint — SDK opens the WSS from the app process
Web faucet button / tDUST balance UI
mn airdrop … --network undeployed + in-app "Register dust"
Getting started

Three steps to a first build.

  1. 01

    Start the Kuira-native local devnet

    Kuira targets the mn CLI toolchain, not the Docker midnight-node:0.22.5 stack the web demos use. Run mn localnet up to 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 →)

  2. 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 ↗

  3. 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/1 collisions break the checksum), then:

    mn airdrop 10000 --wallet <addr> --network undeployed
    Then tap Register dust in the app (NOT mn dust register — Kuira uses its own registration flow). Now Deploy the catalog and Publish a kit; expect ~30–120s cold on-device prove.

Passkey setup checklist

Skip any of these and you'll spend hours in Credential Manager exceptions.

  • Real domain rpId — not REPLACE_ME, not .example. GitHub Pages works (e.g. arunnadarasa.github.io).
  • Hosted assetlinks.json at https://<rpId>/.well-known/assetlinks.json with 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 -r leaves Credential Manager cached.
References

Where to dig deeper.

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.