# Cashu Wallet Native Cashu ecash wallets for iOS and Android. Cashu is Bitcoin-backed ecash: a mint issues bearer tokens against sats deposited over Lightning, and payments between wallets are private by design — the mint does not learn who pays whom. Cashu Wallet wraps that model in a first-class native app on each platform — SwiftUI on iOS, Jetpack Compose on Android — with the same surfaces, copy, and behavior on both. iOS on the first row, Android on the second — same journey on both platforms: | Onboarding | Wallet | Receive | Send | | :---: | :---: | :---: | :---: | | iOS onboarding | iOS wallet | iOS payment received | iOS send amount | | Android onboarding | Android wallet | Android payment received | Android send amount | The full capture set for both platforms — onboarding through settings — lives in [`docs/screenshots/`](docs/screenshots/). All shots show a test wallet funded from the public [Testnut mint](https://testnut.cashu.space); the balances are not real sats. ## Features - **Ecash** — hold sats as Cashu tokens; send and receive them as QR codes or copyable strings, without touching a Lightning channel. - **Lightning** — fund the wallet and pay invoices through the mint, with BOLT11 invoices and BOLT12 offers. - **On-chain Bitcoin** — receive to and send from mints that support it. - **Cashu Requests (NUT-18)** — publish a reusable, address-shaped payment request that senders pay over Nostr relays, without leaking your mint or balance to anyone watching a single endpoint. - **NFC contactless** — tap-to-pay ecash between devices. - **Locked ecash (P2PK)** — lock a send to the recipient's key so only they can redeem it. - **Multi-mint** — add mints by URL or QR, discover public mints, and keep per-mint balances visible. - **Nostr Wallet Connect** — let other apps spend from the wallet with scoped permissions. - **Backup & restore** — BIP-39 seed phrase backup and restore, plus an App Lock behind the platform's biometrics. ## Repository layout - `ios/` — SwiftUI app, Xcode project, unit + UI tests, helper scripts. Targets iOS 18+. - `android/` — Kotlin / Jetpack Compose app and Gradle project. `minSdk 26`, `targetSdk 36`. - `docs/product/` — shared product, design, and copy contracts both apps implement. Platform notes live in `docs/ios/` and `docs/android/`. - `CI/` — local mint infrastructure for integration tests: Nutshell and CDK mints running a FakeWallet Lightning backend, so end-to-end payment flows run without a real Lightning node. Both apps are built on the [Cashu Dev Kit](https://github.com/cashubtc/cdk) (CDK) through its native FFI bindings. ## Building iOS (requires Xcode with the iOS 18+ SDK): ```sh cd ios xcodebuild -project CashuWallet.xcodeproj \ -scheme CashuWallet \ -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ build ``` Android (requires JDK 17 and an Android SDK; point `local.properties` or `ANDROID_HOME` at it): ```sh cd android ./gradlew --no-daemon :app:assembleDebug ``` ## Testing Unit tests: ```sh # iOS cd ios && xcodebuild test -project CashuWallet.xcodeproj -scheme CashuWallet \ -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ -only-testing:CashuWalletTests # Android cd android && ./gradlew --no-daemon :app:testDebugUnitTest ``` Integration tests run the apps against real mint implementations started locally — see [`CI/README.md`](CI/README.md) for the full setup: ```sh ./CI/setup-nutshell.sh && ./CI/start-nutshell.sh ./CI/setup-cdk.sh && ./CI/start-cdk.sh ``` ## License [MIT](LICENSE)