Skip to the content
nullroute

Open source air-gapped Bitcoin signer

Built to be checked, not to be trusted.

nullroute turns a Raspberry Pi and the official 7 inch touchscreen into a Bitcoin signing device with no network of any kind. Roll dice for your seed, move transactions by QR code, and read every one on the device before it signs.

Pre-release and unaudited. Hardware bring-up on a Pi 5 and a Pi 4 is next.

Two hashes, before the PIN
The first screen: the hash of the software it is about to run, shown before it asks for anything. Rendered from the device frontend at 800x480.

How it works

From dice to a signature.

Your wallet software on a networked computer prepares transactions. The device holds the keys, shows you what you are signing, and has no network to reach.

  1. A hundred rolls
    01

    Roll the dice

    A hundred rolls of an ordinary die become your seed, by arithmetic you can repeat on any computer.

  2. The words, once
    02

    Write the words once

    The 24 words are shown once. On paper they are your backup, and they restore in other wallets too.

  3. A transaction it will not sign
    03

    Review, then sign

    Scan your wallet’s QR code with a USB webcam. The device lays out what it would sign, refuses what it should not, and hands back a signed QR code.

Every screen, and what each one refuses

Don’t trust, verify

One hash for every line of code that ships.

Before it asks for a PIN, the device shows the SHA-256 of a plain listing of all 438 files it runs. Build the source, run one command with standard tools, and compare. If the two differ, do not enter your PIN.

$ git clone https://github.com/Xaxis/nullroute && cd nullroute$ sha256sum MANIFEST.lockf08ead186b9eb2a84e77e5850cccad26b7eb7486757d0911558ff296113e7d0c  MANIFEST.lock

This build’s root, read from the repository when this site was built. Nothing has been released yet, so there is no published value to compare against.

$ printf '%s' '1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234' | sha256sume56403e8522ddeae1b44a1e8148b1ba4d3b4c626ccf20980056eedcc7e0c0f35  -

The seed rule with no code of ours: a hundred public example rolls from the entropy document, recomputed when this site was built. Never use these rolls for money.

module specifications
39module specifications
invariants, each bound to tests
354invariants, each bound to tests
tests in the suite
1376tests in the suite
files under one hash
438files under one hash

What you need

Off-the-shelf parts, roughly $100 to $120.

No secure element and nothing exotic. The device needs a 64-bit Raspberry Pi, the 800x480 touchscreen it is laid out for, a webcam and an SD card.

How to build one

For every signer

Not just a device: an open standard.

The signer profile says what any air-gapped signer must show you and refuse to do: 63 requirements, with 116 portable test cases in a conformance kit that runs against any signer through an adapter.

Where it stands

Honest about what is not done.

Phases 1 to 4 of 7 are built, apart from signing and publishing a release, and hardware bring-up is next. It has not been audited, so keep real money off it until bring-up and an outside review are both done.

  1. Phase 1, builtSpec system, entropy, BIP-39/32, daemon, lock screen, networks
  2. Phase 2, partly builtDescriptors, addresses, PSBT review, signing. Provisioning tier 0.
  3. Phase 3, builtEncrypted store, passphrase, multisig, cosigner registration, tier 1 boot attestation
  4. Phase 4, builtBIP-322 message signing, BIP-85 child seeds, BIP-329 labels
  5. Phase 5, not startedWallet layer, optional and lower assurance
  6. Phase 6, not startedBridge companion, runs on a networked machine
  7. Phase 7, not startedMiniscript, taproot script paths, SeedXOR. Tier 2.

The roadmap

Build one, or start by reading the code.

MIT licensed, built in the open, and written to be read by people who do not trust its author.