Keycard Shell is the UI and transport layer around the Keycard applet. The Keycard stores and signs keys; the Shell handles QR and USB workflows.
Keycard Shell uses the EIP-4527 animated QR format and the Blockchain Commons UR encoding for sign requests and responses.
References:
Supported UR payloads are defined in the CDDL file:
Examples of UR types used by Shell include:
eth-sign-request, eth-signature)crypto-psbt)btc-sign-request, btc-signature)crypto-multi-accounts) for wallet integrationsWhen USB data is enabled, Shell enumerates as a USB HID device (VID 0x1209, PID 0x21f7) and speaks an APDU-like protocol.
Full protocol details and command list live here:
Highlights:
CLA(0xe0) + INS + P1 + P2 + Lc + Data.GET RESPONSE is used for multi-chunk responses (SW=0x61XX).Clear signing for contract calls uses an on-device database containing chains, ERC-20 metadata, and Ethereum ABIs.
Primary sources and tooling:
You can reproduce database builds from source JSON inputs and verify the hash (signature excluded) with tools/database-hash.py.
Keycard Shell firmware images are signed. The bootloader verifies a secp256k1 signature with an embedded public key before booting:
Official devices only accept signed firmware updates. To run custom firmware you must build your own device (or a dev unit) with a bootloader key you control.
Build notes:
deployment/bootloader-pubkey.txt and deployment/fw-test-key.txttools/firmware-hash.py to verify a build against a release tagtools/create-image.py to generate a full flashable imageThere is no separate "bitcoin-only" firmware. You can use Keycard Shell with Bitcoin-only wallets (QR/UR PSBT flows or USB SIGN PSBT) and simply avoid Ethereum features. Advanced builders can compile custom firmware or databases that omit ETH chain/token/ABI data.
Hardware design files are open source and live in the Keycard Shell repo: