Keycard is a hardware wallet that stores private keys on a dedicated secure chip. Designed as an open-source contactless smart card, it functions as a BIP-32 HD wallet, supporting key generation, derivation, and signing. It also allows exporting keys defined in the context of EIP-1581. The most obvious case for integration of Keycard is crypto wallets (ETH, BTC, etc), however it can be used in other systems where a BIP-32 key tree is used and/or you perform authentication/identification.
It’s natively integrated with all Status apps and works on iOS/Android mobile phones and desktops with a USB smartcard reader. Learn more about keycard here.
Keycard communicates via NFC contactless interface and ISO-7816-1 contact interface. Communication with Keycard happens through a simple APDU interface, together with a secure channel guaranteeing confidentiality, authentication and integrity of all commands.
Keycard Shell is a companion device designed to enhance the Keycard experience. It’s a full fledged hardware wallet in which you insert your Keycard. This way you add to Keycard a range of connectivity options: keypad, display, camera and usb port. Keycard Shell is compatible with wallets like MetaMask, imToken, Rabby, BlueWallet and more.
Keycard Shell enables QR code scanning (EIP-4527) and transaction verification directly on the device, bridging the gap between Keycard’s secure chip and wallets that don’t natively support NFC-based hardware wallets. Announced in March 2025, it evolved from a design journey starting in 2022 (Keycard Origins).
The current version of the applet is 3.1.0
This documentation applies to said version. Semantic versioning is used throughout the project, with the omission of the patch number for the applet, but not the SDK and related tools. The version of all components of the Keycard project are tied to the protocol version.
You are at the right place to find informations about Keycard and get you going.
If you need more and want to discuss:
The most obvious case for integration of Keycard is crypto wallets (ETH, BTC, etc), however it can be used in other systems where a BIP-32 key tree is used and/or you perform authentication/identification.
A feature added in version 3.1.0 of the applet is a duress PIN, which is completely transparent in the API and undetectable. It changes the keys generated during derivation in a deterministic way. Wallets should make sure they account for this by hiding balance and wallet address until proper authentication, and eventually be able to transparently switch to using the addresses generated after inserting the duress PIN.
To further simplify integration, we have developed a Java-based API which can be used on both desktop and Android systems. On the desktop it uses the javax.smartcardio to interface with the card, which is compatible with most USB readers. On Android it uses the on-board NFC reader. If you develop in Java or any other language available, this is the easiest way to use the Keycard. You can also find a Go and Swift SDK and more resources here
If you use a different language, please first refer to the Java SDK documentation for a high level overview of how to perform different tasks with the Keycard. Then, please check the protocol documentation out for the low-level details.
Since Keycard 3.0, besides the hardware wallet functionality, you find a second applet with a different purpose and security model. This applet, internally called Cash applet, does not share any data with the wallet and provides a single keypair which can be used to sign any piece of information. Unlike the wallet applet, the cash applet does not require a PIN or SecureChannel and can be tapped on 3rd party terminal. This enable convenient in-person interactions at the expense of security. For this reason the keypair in the Cash applet should not hold any funds at all, but should instead be used in concert with smartcontracts in scenarios with lower security requirements. It is especially suited for signing EIP-712 formatted metatx. Some examples can include ticketing, small payments, etc. It is worth repeating that the Wallet and Cash applet, while living on the same card, do not share any data or key and are completely independent from each other. In order to easily integrate Keycard with any dApp, we defined a small extension to the Web3 API.