Sheet S-03 · Checklist
Security and UX checklist
Twenty-eight checks that catch the mistakes Bitcoin apps keep repeating. Tick an item when it is true of your app today. Mark it N/A when it genuinely does not apply, such as web-only advice for a mobile app. Progress is remembered on this device.
Security
0 of 14 doneProtect keys, verify what is signed, and limit who and what can touch either. These checks assume you handle keys or transactions; if you build a watch-only tool, mark the ones that do not apply.
Generate keys and seeds with the operating system's cryptographically secure random generator, through an established library. Never seed from timestamps, taps or home-made randomness.
Seed words, private keys and passphrases stay out of every log, telemetry event, crash dump and support ticket. No support channel should ever ask a user for them.
Require device unlock, a PIN or biometrics before signing or revealing secrets. Rate-limit attempts, lock automatically after inactivity, and decide what happens after too many failures.
Check format, checksum and network on every pasted or scanned address. Reject test-network addresses on the main network and the reverse, and say why in plain words.
Build the confirmation screen from the final transaction: outputs, change, fee and total. If anything changes after the user confirms, ask again.
Display full addresses in readable groups, flag a clipboard that changes after pasting, and warn when a new recipient looks suspiciously similar to a saved one.
List each server the app contacts and what it can learn: addresses, balances, IP address, timing. Remove what you can and disclose the rest in settings.
Lock versions, read changelogs before upgrading, remove packages you can live without, and treat anything that touches keys or transactions as code you must understand.
Distribute builds through channels users can verify. Sign releases, publish checksums and explain how to check them. Plan in advance how you would ship an emergency fix.
One page is enough: what you protect, who might attack, where the trust boundaries sit. The wizard's risk register is a starting point. Revisit it whenever scope changes.
Exercise every value-moving flow on a Bitcoin test network. Automated tests should cover fee rounding, dust-sized outputs, change handling, insufficient funds and malformed input.
Serve key-handling pages with a strict content security policy and without third-party scripts, tag managers or widgets. Keep them apart from marketing pages.
Separate who can request, approve and execute withdrawals. Set limits and delays for large movements, keep most funds in colder storage, reconcile your ledger against the chain, and rehearse incident response.
Have someone outside the team review the design and the code that handles keys and transactions. Fix findings, publish what was and was not covered, and claim no more than the review supports.
User experience
0 of 14 doneMost losses begin as confusion. These checks make ownership, timing, fees and recovery understandable to the person holding the phone.
The first screen and the balance say whether the user or you hold the keys. Avoid vague words such as secured or protected unless you also say by whom.
Pick a primary unit, label it, and format amounts consistently. If you show both bitcoin and satoshis, make the relationship explicit and never mix them in one field.
Name the stages of a payment, explain that blocks arrive about every ten minutes on average, and never mark a payment final at the moment of broadcast.
Full recipient, amount, fee, total deducted and any change, on one screen. No truncated addresses and no hidden fee lines.
Offer a default that suits most people, a short scale of options in plain language, and a route to speed up a payment that is stuck.
Show the backup once, verify it before continuing, and provide a way to test a restore. Explain what the backup does and does not contain.
Show a fresh address, a QR code and copyable text together with the network name. Explain gently why reusing addresses is discouraged.
Every error has those three parts. Avoid blaming users, avoid codes without words, and make retries safe so nothing is ever sent twice.
When a data source is unreachable, show the last known state with a timestamp, say what cannot be done right now, and recover without a restart.
Cover who holds the keys, what a backup is and what cannot be undone. Defer everything else until it matters, and keep a glossary within reach.
Say once, plainly and without scare tactics, that sent payments cannot be reversed by the app, and suggest a small first payment.
A new account with a zero balance should show how to receive first, not a broken-looking blank. The same goes for empty history, an empty address book and first launch.
A settings page lists what third parties can see. Analytics stay off until the user turns them on, and never include addresses or amounts.
Text meets contrast guidelines, controls have labels and generous tap targets, amounts and addresses are readable by screen readers, and information is never carried by colour alone.
Try another filter, or choose All to see the whole checklist.
Guidance only. Completing every item does not make an app safe. The checklist exists to prompt better questions and better conversations with reviewers, not to replace them. Pair it with the blueprint wizard and the principles.