nullrouteSource

An air-gapped Bitcoin signing device you can actually verify.

Runs on a Raspberry Pi. Generates seeds from dice you rolled yourself. Signs PSBTs across an air gap. Every module ships with a machine-checkable specification, and the device refuses to run unless code, specs, and tests all agree.

Do not take our word for it

A hardware wallet that generates your seed inside a black box is asking you to trust the box. In 2024 a widely used one turned out to ship a random number generator that did not behave as documented, and the industry answered by promising a better black box.

Here is the alternative. Roll some dice below, then run the command it gives you in a terminal.

Try it hereruns entirely in your browser
Entropy0 of 256 bits

0 rolls. 100 more for a real seed. 99 is not enough: it is 255.911 bits.

Press the numbers. Each one is a roll of a six-sided die. The device does exactly this, and nothing else, to turn dice into a seed.

This is a demonstration, not a wallet. Do not use anything generated in a browser tab to hold money. On the real device the same arithmetic happens on a machine with no network, and the words never leave it.

That is the whole idea. If a device shows you a different value for the same rolls, it is lying to you and you can tell. No special tooling, no trust in us. The full procedure, including why the answer is 100 rolls and not 99, is in Entropy.

The device

A 7 inch touchscreen on a Raspberry Pi. These are screenshots of the running software, not mockups.

Roll the dice
Roll the dice

Live entropy accounting, truncated so it never claims more than you have. Warnings appear and never block: a fair die can look suspicious, and the device does not discard your rolls.

Your addresses
Your addresses

Every script type, receive and change, with the derivation path under each address. No balances, because the device has no network and will not pretend otherwise.

Is this address mine?
Is this address mine?

Paste an address a coordinator gave you. The device re-derives it from your seed and answers, rather than comparing against a list it was handed.

Before you unlock
Before you unlock

The hash of the running code, and a plain statement of what it does not prove. Compare it against what you built. If they differ, do not enter your PIN.

Before you trust this with anything

There is no secure element

Keys are encrypted under a key derived from your PIN, and that is the entire physical defence. Someone holding your SD card is limited only by your PIN strength. A Coldcard or BitBox02 is genuinely better on this specific axis.

One signer in a quorum

Designed for 2-of-3 or 3-of-5 alongside hardware from other vendors, where nullroute is the one you can fully audit. Sole custody of meaningful funds is a use we have not designed for.

Not finished

Pre-1.0 and unaudited. There is no encrypted store and no PIN gate yet, so there is nowhere to persist a wallet. Do not put money on this.

What it does

Signs without leaking
RFC 6979 deterministic ECDSA and BIP-340 Schnorr with aux_rand fixed to zero. Signatures are byte-identical every time, so there is no free space to hide key material in. A randomised signature can leak your key a few bits per transaction and nothing on screen looks wrong.
Verifies change by re-deriving it
An output is labelled change only if the address re-derives from a registered descriptor at a valid change path. Anything else is shown as a payment, whatever the transaction claims.
No network, at all
Not for updates, not for fee estimation, not for fonts. Enforced by a lint rule with its own regression suite, a runtime assertion, and a kernel-level restriction on the daemon, rather than by convention.
No lock-in, proved in CI
Every wallet is recoverable from the BIP-39 mnemonic plus a standard descriptor, using Bitcoin Core and no nullroute code. There is a test that does exactly that against regtest, and it is the most important test in the suite.

Run it yourself

You do not need a Raspberry Pi to look at this. The whole device runs on a Mac or Linux machine, and the lock screen will show the hash of the code you just built.

requires Node 24
git clone git@github.com:Xaxis/nullroute.git
cd nullroute
make install
make dev          # the device, at 127.0.0.1:5180

Hardware for a real one runs about $100 to $120: a Raspberry Pi, a small touchscreen, an SD card and one die. The bill of materials is in the README.

Documentation

Rendered directly from docs/ in the repository. The page you read here and the file that ships with the code are the same bytes.

Status

The signer is being built before the wallet, and the verification system was built before the signer. Nothing later is pulled forward: that ordering, and the irreversible work staying last, is what keeps a large feature list from eroding the small part that holds keys.

PhaseScopeState
1Spec system, entropy, BIP-39/32, daemon, lock screen, networkscomplete
2Descriptors, addresses, PSBT review, signingTier 0: reproducible, signed imagein progress
3Multisig, cosigner registration, encrypted store, PINTier 1: dm-verity, boot attestationnot started
4BIP-322 message signing, BIP-85, BIP-329 labelsnot started
5Wallet layer, optional and lower assurancenot started
6Bridge companion, runs on a networked machinenot started
7Miniscript, taproot script paths, SeedXOR, silent paymentsTier 2: signed boot chain (irreversible)not started