Download iOS App | Download Android App
Watch-only Bitcoin Wallet for iOS & Android
Try it risk-free! A REGTEST VERSION is available on both app stores, allowing you to practice air-gapped transactions with test bitcoin — no real funds required.
Download iOS App(ver.regtest) · Download Android App(ver.regtest)
Coconut Wallet is a watch-only Bitcoin wallet designed to work with Coconut Vault. By operating the vault and wallet on two physically separate devices, it implements a secure air-gapped transaction signing architecture where private keys never touch an online device.
No hot wallet. Watch-only only.
- Supported hardware wallets — Keystone 3 Pro, Seedsigner, Jade, Coldcard, Krux
- Air-gapped signing — Private keys never leave the offline device
- SegWit — Native SegWit (Bech32) address support
- Multisig — Multi-signature wallet support
- RBF (Replace-By-Fee) — Fee bumping for unconfirmed transactions
- CPFP (Child-Pays-For-Parent) — Fee acceleration via child transactions
- Batch sending — Send to multiple recipients in a single transaction
- UTXO management — Coin control with UTXO locking and tagging
- PSBT — BIP-174 Partially Signed Bitcoin Transactions
- Draft transactions — Save transactions as drafts for later signing or sending
- Multilingual — 한국어, English, 日本語, Español
OFFLINE ONLINE
┌─────────────────┐ QR Code ┌─────────────────┐
│ Coconut Vault │ ◄──────────────────────► │ Coconut Wallet │
│ │ │ │
│ · Key storage │ │ · Balance sync │
│ · Tx signing │ │ · Tx creation │
│ │ │ · Broadcasting │
└─────────────────┘ └─────────────────┘
The wallet stays online to keep your wallet data up to date and broadcasts signed transactions to the Bitcoin network.
| Project | Description |
|---|---|
| coconut_lib | |
| coconut_vault | |
| coconut_wallet | |
| coconut_design_system |
- Flutter SDK (3.29+)
- Dart 3.7+
- Android Studio or Xcode
- Go (1.26+) — required to build the BitBox02 bridge
flutter --version
go versiongit clone https://github.com/noncelab/coconut_wallet.git
cd coconut_wallet
flutter pub getThis project uses gomobile to generate native bindings for the BitBox02 hardware wallet bridge. See docs/bitbox02-dev-guide.md for the full setup guide.
Quick steps:
# 0. Clone the required fork as a sibling directory (do NOT use upstream BitBoxSwiss)
git clone https://github.com/4xvgal/bitbox02-api-go.git ../bitbox02-api-go
cd ../bitbox02-api-go && git checkout fix/nil-guard-psbt && cd ../coconut_wallet
# 1. Install Go (if not already installed)
brew install go
# 2. Install gomobile and add to PATH
go install golang.org/x/mobile/cmd/gomobile@latest
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.zshrc && source ~/.zshrc
# 3. Initialize gomobile (re-run if you upgrade Go, Xcode, or Android NDK)
gomobile init
# 4. Sync Go dependencies
cd go && go mod tidy && cd ..
# 5. Build native bindings (16KB page-aligned for Android 15+)
make gomobile-bind # both iOS and Android
# make gomobile-ios
# make gomobile-androiddart run build_runner build --delete-conflicting-outputs
dart run realm generate
flutter pub run slangOr run all at once:
make readyIf Realm generation fails, run
dart run build_runner cleanfirst.
This project requires environment variables configured via flutter_dotenv. To obtain the env file for development, please contact us at hello@noncelab.com.
Generate a local keystore for Android builds:
keytool -genkey -v -keystore android/app/local.jks \
-storepass android -alias local -keypass android \
-keyalg RSA -keysize 2048 -validity 10000 \
-dname "CN=Local Dev,O=Coconut,C=KR"Create key_regtest.properties and key_mainnet.properties under the android/ directory:
keyAlias=local
storeFile=../app/local.jksRelease signing passwords are not stored in these files. For local Android release builds, run:
./android/scripts/build_android_release.shThe script prompts once for the keystore/key password and uses it for both storePassword and keyPassword during the build.
For local Android release runs on a connected device, run:
./android/scripts/run_android_release.shThis uses the Android debug keystore for the local release run only.
# Debug
flutter run --flavor regtest
# Release on a connected Android device
./android/scripts/run_android_release.sh| Flavor | Description |
|---|---|
mainnet |
Real Bitcoin mainnet — production release distributed via app stores |
regtest |
Local testnet — for learning and development |
Android Studio / IntelliJ
Run → Edit Configurations... → Set Build Flavor to regtest
VS Code — .vscode/launch.json:
{
"name": "coconut_wallet (debug)",
"request": "launch",
"type": "dart",
"args": ["--flavor", "regtest"]
}
⚠️ Mainnet Self-Build Disclaimer: If you build and run the app from source on mainnet outside of official distribution channels (App Store / Google Play), we assume no responsibility for any loss of funds or errors that may occur. Please useregtestmode for development and testing.
Please refer to CONTRIBUTING.md for details.
- Issues — Bug reports and feature requests
- Pull Requests — New features, documentation improvements, and bug fixes
If you discover a critical security vulnerability, please report it directly to hello@noncelab.com instead of opening a public issue.
X11 Consortium License (identical to MIT, with an additional restriction that the copyright holder's name may not be used for promotional purposes).
See LICENSE for details.
All third-party libraries used in this project are licensed under MIT, BSD, or Apache. See the full list for details.
| Website | coconut.onl |
| X (Twitter) | @CoconutWallet 🌐 / @Coconut 🇰🇷 |
| Discord | Join our Discord |
| Documentation | Tutorials & Docs |
| GitHub | github.com/noncelab |
| Company Site | NonceLab |

