Skip to content

About

Air-gapped wallet for Status Keycard - Android and iOS

Topics

Resources

Contributing

Stars

11 stars

Watchers

2 watching

Forks

Latest commit

 

History

502 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Keycard Pal

Keycard Pal icon

Website CI Build & Release License Test coverage Platform React Native GitHub release Last commit Stars

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.

Screenshots

Welcome Scan QR code Ethereum transaction review

EIP-712 permit review Bitcoin PSBT review Signature QR code

Recovery phrase backup PIN entry

Features

  • 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

Requirements

  • 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.

Getting the app

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.

Get it on GitHub Get it on Obtainium Get it on F-Droid Get it on Google Play Download on the App Store

Verification info

  • 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.txt is 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.

Install from GitHub

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 with Obtainium

  1. Install Obtainium.
  2. Add https://github.com/mmlado/keycard-pal as a GitHub app source.
  3. Use GitHub Releases as the update source.
  4. Select the universal APK from the latest release.

Install via F-Droid

Repository URL:

https://fdroid.keycardpal.com/repo/

Fingerprint:

24EB891A8A617F8BF20892CB0CF9267709BA94056E64242AD9EDF638C2FED3D2

The APK is built automatically by GitHub Actions on every version tag.

Install from Google Play

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.

Install from the App Store

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.

Building from source

Prerequisites

  • 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

Setup

npm install
cd ios && pod install   # iOS only

Run (development)

npm 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 Simulator

Release build

cd android && ./gradlew assembleFullRelease      # Keycard Pal (com.keycardpal)
cd android && ./gradlew assembleOfflineRelease   # Keycard Pal Offline (com.keycardpal.offline)

Development

npm test      # Jest test suite
npm run lint  # ESLint

How it is built

Keycard 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.

Buy me a coffee

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.

Security

  • 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 no INTERNET permission at the manifest level — no runtime flag can enable networking

License

MIT

About

Air-gapped wallet for Status Keycard - Android and iOS

Topics

Resources

Contributing

Stars

11 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages