Air-gapped hardware wallet companion

Your keys stay on the card.

Keycard Pal signs Ethereum and Bitcoin with a Status Keycard over NFC. It talks to your wallet through animated QR codes, so nothing you sign has to pass through an internet-connected device. Free, open source, no telemetry.

Keycard Pal reviewing an Ethereum transaction: chain, amount, recipient and fees
  • Private keys never leave the card
  • No accounts, no analytics, no telemetry
  • MIT licensed
  • Reproducible release builds
  • Offline build with no internet permission

How it works

Four steps, no cable.

Your everyday wallet stays watch-only. Keycard Pal holds nothing and connects to nothing.

Wallet shows a request

MetaMask, Rabby, Sparrow, BlueWallet or Bitget renders the transaction as a QR code.

Scan and review

Keycard Pal decodes it and shows what you are actually signing, in words.

Tap the Keycard

Enter your PIN, hold the card to the phone. The card signs; the key never moves.

Show the signature back

The signature goes back as an animated QR code. Your wallet broadcasts it.

Features

Read it before you sign it.

Every request is decoded and laid out before the card is ever asked to sign. Everything below works with no network connection.

Ethereum transactions

Legacy, EIP-1559 and EIP-2930. Chain name, amount in the native currency, recipient, fees and decoded calldata.

EIP-712 typed data

Decoded review with dedicated screens for Permit, PermitSingle and Safe transactions, plus the digests the card signs.

Clear signing

EIP-7730 descriptors turn contract calls into plain rows. A registry snapshot ships with the app and works offline.

Personal messages

EIP-191 and Sign-In with Ethereum, so logging in to a dApp is a review like any other.

Bitcoin

PSBT signing with a per-input review, and BIP-322 message signing.

Wallet export

Watch-only keys out to MetaMask, Rabby, Ledger Live, Sparrow, BlueWallet and Bitget as UR QR codes.

Key material

Generate a key pair on the card, import a BIP-39 phrase of 12 or 24 words with an optional passphrase, SLIP-39 shares, or scan a SeedQR.

Genuine card check

The card's certificate is verified before pairing, and an unrecognised one is brought to you before anything is written.

Card management

PIN, PUK and duress PIN, pairing slots, card name, factory reset. Nothing about your card is stored on the phone.

Online extras, off until you turn them on.

The standard build can reach the network for these four. Each one ships disabled, and none of them ever sees a private key.

Opt-in

WalletConnect

Connect a dApp straight to Keycard Pal instead of scanning codes, and approve its signing requests on the same review screens. You supply your own Reown Project ID.

Opt-in

Tenderly simulation

Simulate a transaction before you sign and see the balance changes it would cause. You supply your own Tenderly account and API key.

Opt-in

ENS names

Reverse-resolve addresses to .eth names through an RPC endpoint you choose.

Opt-in

Token images

Fetch token logos from their public sources. Token symbols and decimals are bundled either way.

Nothing here is enabled by default, no key or credential is shipped with the app, and no traffic reaches the developer. If you would rather not have the option at all, install Keycard Pal Offline, which has no internet permission in its manifest.

Two builds

Pick how much network you want.

Both sign and manage keys identically. They differ in one line of the Android manifest.

Keycard Pal

com.keycardpal
  • Everything in the offline build
  • WalletConnect, Tenderly simulation, ENS names and token images available
  • Each of them off until you turn it on in Settings

Keycard Pal Offline

com.keycardpal.offline
  • No INTERNET permission in the manifest
  • The online code is not in the build, not merely switched off
  • Signing, key management and wallet export, unchanged

Screenshots

What it looks like.

Welcome screen
Welcome
Scanning an animated QR code
Scan a request
Ethereum transaction review
Ethereum review
EIP-712 permit review
EIP-712 permit
Bitcoin PSBT review
Bitcoin PSBT
Signature returned as a QR code
Signature out
Recovery phrase backup
Recovery phrase
PIN entry
PIN entry

Install

Available now on Android.

Google Play carries the standard build. The developer-signed APKs on GitHub and in the F-Droid repository below carry both builds, including Keycard Pal Offline.

iOS — coming soon F-Droid main repository — coming soon

The Play copy is re-signed by Google Play App Signing; the GitHub and F-Droid copies are signed by the developer. Two different signatures means one cannot update the other, so pick a source and stay with it. The F-Droid repository above is the developer's own, serving the same APKs that are attached to each GitHub release.

F-Droid repository URL
https://fdroid.keycardpal.com/repo/
Repository fingerprint
24EB891A8A617F8BF20892CB0CF9267709BA94056E64242AD9EDF638C2FED3D2
Signing certificate SHA-256
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
Requirements
Android 7.0 (API 24) and NFC. A Keycard.

Every release attaches SHA256SUMS.txt so you can check an APK before installing it, plus per-architecture splits for a smaller download. For most people the universal APK is the right one.

The hardware

Keycard Pal needs a Keycard.

The app is the companion, not the wallet. Signing happens on a Status Keycard, an NFC smart card you hold to the back of the phone. No USB, no Bluetooth, no battery. Cards are sold at keycard.tech.

Advertisement The 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 feature depends on buying through them, every feature of the app is free, and a Keycard bought anywhere works exactly the same. The iOS app carries no affiliate link and points at the product site instead.

How it is built

Stated up front.

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 that runs on every pull request, 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. Every release is tested on real Keycards and real phones before it ships.