Keycard Pal is an air-gapped companion app for Status Keycard, on Android and iOS. It lets you sign Ethereum and Bitcoin transactions over NFC, so your private keys never touch an internet-connected device.
All communication with your watch-only wallet happens through animated QR codes using the Blockchain Commons UR standard. No telemetry.
On Android, Keycard Pal comes in two variants:
| Variant | Package ID | Internet |
|---|---|---|
| Keycard Pal | com.keycardpal |
Optional. WalletConnect, ENS names, Tenderly simulation and token images, each off until you turn it on in Settings |
| Keycard Pal Offline | com.keycardpal.offline |
Never. The INTERNET permission is absent from the manifest |
Both variants are fully functional for signing and key management. Keycard Pal Offline is the right choice if you want a hard, manifest-level guarantee of no network access.
On iOS there is one app, Keycard Pal, with the same opt-in online features; there is no offline variant.
- Sign Ethereum transactions: legacy, EIP-1559, and EIP-2930
- Sign EIP-712 typed data with a decoded preview before you approve
- Sign personal messages (EIP-191 / SIWE)
- Sign Bitcoin transactions via PSBT
- Sign Bitcoin messages (BIP-322)
- Export wallet keys to MetaMask, Rabby, Ledger Live, Sparrow, BlueWallet, and Bitget
- Generate and load key pairs directly onto the Keycard
- Import a recovery phrase (BIP-39, 12 or 24 words, with optional passphrase)
- Import SLIP-39 Shamir Secret Sharing shares
- Genuine Keycard verification before first pairing
- Two Android variants: Keycard Pal Offline (no internet, manifest-level guarantee) and Keycard Pal (optional, opt-in online features: WalletConnect, ENS names, Tenderly transaction simulation, token images); iOS ships Keycard Pal
- Android 7.0+ (API 24) with NFC, or an iPhone 7 or later on iOS 15.1+
- A Status Keycard NFC smart card
Advertisement: the purchase link above and the Buy a Keycard links in the Android app are affiliate links. The developer earns a commission on purchases made through them. No app feature depends on buying through them, and every feature of the app is free. The iOS app carries no affiliate link and points at the product site instead.
Both Android variants, including Keycard Pal Offline, are attached to every GitHub release
and served from the developer's F-Droid repository. Keycard Pal (com.keycardpal) is also
on Google Play, and the iOS app is on the App Store. The same channels, with screenshots,
are at keycardpal.com.
- Package ID:
com.keycardpal(Keycard Pal) /com.keycardpal.offline(Keycard Pal Offline) - SHA-256 hash of signing certificate:
A8:3C:11:4B:1F:42:01:DA:FB:D0:3E:22:1F:1C:29:28:EC:B5:2B:78:BD:A5:E9:3F:29:6F:ED:F2:29:8E:54:6B SHA256SUMS.txtis attached to each GitHub Release to verify APK file hashes.- The certificate above signs the GitHub and F-Droid builds. The Google Play copy is re-signed by Play App Signing and has a different one.
Download an APK from the latest release
and sideload it. For most users, install the universal APK. ABI-specific split APKs are also
attached to releases for smaller downloads on known device architectures. Each split carries
its own versionCode (the universal ends in 0, armeabi-v7a in 1, arm64-v8a in 2), and all
three are signed with the same certificate, so a device can take a split over the universal APK
at any time, the universal over a split from the next release on, and move between GitHub,
Obtainium and either F-Droid repository the same way, without reinstalling.
- Install Obtainium.
- Add
https://github.com/mmlado/keycard-palas a GitHub app source. - Use GitHub Releases as the update source.
- Select the universal APK from the latest release.
Repository URL:
https://fdroid.keycardpal.com/repo/
Fingerprint:
24EB891A8A617F8BF20892CB0CF9267709BA94056E64242AD9EDF638C2FED3D2
The APK is built automatically by GitHub Actions on every version tag.
Keycard Pal on Google Play
carries com.keycardpal only; Keycard Pal Offline is not on Play.
Because Play re-signs the app with a Google-managed key, the Play copy and the builds from GitHub or F-Droid have different signatures and cannot replace each other on a device. Pick one source and stay with it; switching means uninstalling first, which removes the pairing data stored on the phone.
Keycard Pal on the App Store is the
iOS app, with the same opt-in online features as com.keycardpal on Android. There is no
offline variant on iOS. NFC tag reading needs an iPhone 7 or later.
- Node.js 22.13.0+
- JDK 17
- Android SDK platform 37 and build-tools 37.0.0, with NDK 27.1.12297006
- Xcode and CocoaPods, for iOS
npm install
cd ios && pod install # iOS onlynpm start # Terminal 1: Metro bundler
npm run android # Terminal 2: build and install
npm run ios # or on a connected iPhone
npm run ios:sim # or on the iOS Simulatorcd android && ./gradlew assembleFullRelease # Keycard Pal (com.keycardpal)
cd android && ./gradlew assembleOfflineRelease # Keycard Pal Offline (com.keycardpal.offline)npm test # Jest test suite
npm run lint # ESLintKeycard Pal is developed with substantial help from AI coding assistants (Claude and
Codex). I decide what gets built, read and test what goes in, and maintain it myself. What
keeps that honest is in the repository: a Jest suite of about 2,600 tests that runs on every
pull request, 16 architecture decision records explaining why things are the way they are,
a check that the offline build carries no online code, and release APKs that anyone can
rebuild byte for byte. Fixes that belonged upstream were sent upstream, to keycard-sdk
and to the React Native Keycard bridge. Every release is tested on real Keycards and real
phones before it ships.
If Keycard Pal keeps your funds safe, you can send a coffee my way. Addresses are in DONATE.md, and on the app's About screen. Donations are voluntary and nothing is unlocked, changed or promised in return.
- Pairing data is stored in encrypted storage backed by the Android Keystore or the iOS Keychain
- Private keys never leave the Keycard; only the signature result is returned to the app
- QR codes use Blockchain Commons UR for structured binary encoding
- Keycard Pal Offline (
com.keycardpal.offline) has noINTERNETpermission at the manifest level — no runtime flag can enable networking
MIT







