Turn your Android phone into a secure Bitcoin hardware wallet and signing device
MetroVault is a secure, offline Android signing device application designed to turn your Android phone into a cold storage hardware wallet. Built with modern Android technologies and a custom Kotlin Bitcoin library, it prioritizes security, simplicity, and user experience. Supports both single-sig and multi-sig (collaborative custody) wallets.
The primary goal of MetroVault is to provide a completely offline environment for managing Bitcoin private keys. It acts as a signer for your watch-only wallets (like BlueWallet, Sparrow, or Electrum) running on online devices. By keeping your keys on a device that never connects to the internet (air-gapped), you significantly reduce the attack surface for theft and malware.
Key Benefits:
- π° Free - Use any Android phone as a hardware wallet
- π Secure - Air-gapped operation with military-grade encryption
- π¨ Open Source - Fully auditable code, no hidden backdoors
- π¨ Modern - Beautiful Material 3 design with Jetpack Compose
| Feature | Description |
|---|---|
| Air-Gapped Operation | Designed for devices with no internet (Airplane mode, WiFi/Bluetooth disabled) |
| Dual-Layer Encryption | AES-256-GCM with PBKDF2 (210k iterations) + Android Keystore |
| Biometric Authentication | Hardware-backed fingerprint/face unlock with crypto binding |
| Plausible Deniability | Separate "Main" and "Decoy" wallets with different passwords |
| Brute-Force Protection | Exponential backoff rate limiting with 24-hour lockout |
| Automatic Wipe | Optional feature to completely wipe sensitive data after 4 unsuccessful login attempts |
- Multi-Type Support: Native SegWit (
bc1q...), Taproot (bc1p...), Nested SegWit (3...), Legacy (1...), Silent Payments (sp1q...) - Multi-Sig Support: Import and sign for collaborative custody wallets (2-of-3, 3-of-5, etc.)
- Silent Payments (BIP-352): Create dedicated SP wallets, send to
sp1qβ¦recipients from any wallet, and sign spends of received SP outputs β all air-gapped. The spend key never leaves the device; only the scan key is exported (spscanβ¦/ descriptor) to the watching wallet. - Change Script Type: Switch a single-sig wallet between Taproot / Native SegWit / Nested SegWit / Legacy without re-importing the seed
- Passphrase Support: Optional BIP-39 passphrase with choice to save locally or keep in session memory only
- Testnet4 Support: Import or create Testnet wallet for testing and development
- Custom Entropy: Add your own randomness via dice rolls or coin flips
- Mnemonic Tools: Built-in checksum calculator and validator
- BIP-85 Derivation: Generate child seeds (12/24 words) and secure passwords from your master seed
- XPRIV Export: Export wallet's extended private key (if needed)
- PSBT Workflow (BIP-174 + BIP-370 v2): Partially Signed Bitcoin Transactions for single-sig and multi-sig
- Multi-Sig Signing: Sign your part of collaborative custody transactions (with locally saved keys)
- Silent-Payment Signing: Sign sends to
sp1qβ¦recipients (the derivedbc1pβ¦is computed on-device and shown alongside thesp1qβ¦on the confirmation screen) and sign spends of received SP outputs viaPSBT_IN_SP_TWEAK(BIP-374) - Transaction Finalization: Finalize fully-signed PSBTs into broadcastable transactions
- QR Code Air-Gap: Scan PSBT β Verify β Sign β Export via QR
- Animated QR Support: BC-UR (v1/v2) and BBQr formats for large transactions
- Address Verification: Confirm receive/change addresses on trusted screen
- XPUB Export: Generate watch-only wallets on your online device
- Descriptor Import: Import multi-sig wallets via QR (BC-UR v2, BBQr) or text
- Descriptor Export: Share your signer info for multi-sig setup (BIP-48 compatible)
- Flexible Derivation: Supports BIP-48 m/48'/0'/0'/2' and m/48'/0'/0'/1' paths
- Sign Messages: Sign messages to prove ownership
- Verify Signatures: Verify signatures and messages
- Qr Code Support: Sign messages using QR codes, and display signature via QR codes.
ββββββββββββββββββββ QR Code ββββββββββββββββββββ
β ONLINE DEVICE ββββββββββββββββββββββββββββΊβ METROVAULT β
β (Watch-Only) β β (Air-Gapped) β
ββββββββββββββββββββ€ ββββββββββββββββββββ€
β β’ Create PSBT β ββββ Unsigned PSBT ββββΊ β β’ Verify details β
β β’ Broadcast TX β βββββ Signed PSBT ββββ β β’ Sign with key β
β β’ View balance β β β’ Never online β
ββββββββββββββββββββ ββββββββββββββββββββ
- Setup: Import your XPUB from MetroVault to create a watch-only wallet on your online device
- Receive: Generate addresses on either device (they'll match!)
- Send: Create unsigned transaction (PSBT) on online device β Display as QR
- Sign: Scan QR on MetroVault β Verify β Sign β Display signed PSBT QR
- Broadcast: Scan signed QR on online device β Broadcast to network
| Category | Technology |
|---|---|
| UI Framework | Jetpack Compose (Material 3) |
| Architecture | MVVM with Clean Architecture |
| Cryptography | Custom Kotlin Bitcoin Library (Secp256k1, BIP-32, BIP-39, BIP-48, BIP-174, BIP-352, BIP-370, BIP-374) |
| Storage | EncryptedSharedPreferences (Android Keystore) |
| QR Codes | ZXing + bcur-kotlin & bbqr (Kotlin ports for BC-UR and BBQr animated multi-frame QR) |
| Biometrics | AndroidX Biometric Library (BIOMETRIC_STRONG) |
| Min SDK | Android 8.0 (API 26) |
MetroVault is on F-Droid with reproducible builds β F-Droid independently rebuilds the app from this source, verifies it byte-for-byte against the release, and publishes it signed with the developer's key. To verify an installed APK:
- Package ID:
com.gorunjinian.metrovault - Signing certificate SHA-256:
1245554ceb17cea21e9912af7bf60d38d716f5884d4b3664e5338462cc76fd03
Prerequisites:
- Android Studio Ladybug or newer
- JDK 17
- Android device (API 26+)
Steps:
# Clone the repository
git clone https://github.com/gorunjinian/MetroVault.git
# Open in Android Studio
# Sync Gradle project
# Build
# Install on your air-gapped deviceCheck the Releases page for pre-built, signed APKs.
β οΈ Security Note: For production use, always build from source and install on a factory-reset device that remains permanently offline.
For maximum security, use a dedicated device:
1. Remove SIM card
2. Factory reset before installation
3. Skip Google account setup (offline only)
4. Enable Airplane mode permanently
5. Disable WiFi, Bluetooth, NFC, Mobile data
6. Disable USB debugging
π± New to this? Follow the Device Setup Guide β a full step-by-step tutorial covering every step above, from factory reset to your first wallet, including how to verify and sideload the APK onto a device that never goes online.
Optional β debloat first: before sideloading MetroVault, consider running android-debloater, a companion bash script that uses adb to uninstall bloatware and pre-installed network-reaching apps on a fresh device. The fewer packages that can phone home, the smaller the attack surface left on your air-gapped signer. After debloating, disable USB debugging.
Detailed documentation is available in the repository:
| Document | Description |
|---|---|
| DEVICE_SETUP.md | Step-by-step tutorial for preparing a dedicated air-gapped device |
| SECURITY.md | Complete security architecture and encryption model |
| SEED_GENERATION.md | How wallets are generated, stored, and used |
Contributions are welcome! Please feel free to submit issues and pull requests.
- Bugs: Open a GitHub issue with reproduction steps
- Features: Open a discussion or issue with your proposal
- Security: See SECURITY.md for responsible disclosure
MetroVault is free software, licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later). You are free to use, study, share, and modify it; any distributed derivative must remain free software under the same license. See LICENSE.txt for the full text.
The bundled QR libraries bbqr-kotlin and bcur-kotlin are separate works under the MIT License.
- Bitcoin - The protocol that makes this all possible
- ACINQ - Custom Bitcoin library from ACINQ's implementation
- Jetpack Compose - Modern Android UI toolkit
- ZXing - QR code generation and scanning
- The open-source Bitcoin community for BIP standards
MetroVault is currently in active development.
While every effort is made to ensure security and correctness, using early-development software for managing real funds carries risks:
- Always verify addresses on the device screen
- Test with small amounts first
- You are responsible for your own keys - ensure proper mnemonic backups
- Review the code yourself or have it audited before trusting with significant funds
Made with β€οΈ for Bitcoin by Gorun Jinian









