Entropy Workshop A single file from selfcustody.ca. It fetches nothing, and works with the network off.
Offline-capable tool

Entropy Workshop

Flip a coin, roll dice, or draw a card physically — then see the wallet those events produce. Nothing here generates randomness on its own — you supply every bit.

View source on GitHub
  • Running self-test…
  • Checking…
  • No network requests
Running the local copy

This self-contained file is running from your disk, not the network. Copy it to a USB stick or an air-gapped machine and it behaves exactly the same. Check it against the published checksum below before you trust anything it shows you.

Running from:

Verify this file against the published checksum

Check that this is the file that was published, rather than whatever happened to arrive:

certutil -hashfile entropy-offline.html SHA256Windows shasum -a 256 entropy-offline.htmlmacOS, Linux

Compare that against the published entropy-offline.html.sha256, which sits beside this page on selfcustody.ca. That one line is the only thing you need the network for, and you can fetch it from anywhere.

Disposable test vector

Build the same wallet, independently.

Set the conversion your device uses, enter your sequence, and compare the words and addresses side by side. If they disagree, try another conversion before blaming the device.

1. Which entropy source?

2. Which conversion method?

3. How many words?

4. Which address type?

Each has its own derivation path, filled in below.

5. Account path

This is the account path for account 0, the default every wallet opens with. The receiving branch is /0/0 and the change branch is /1/0 below it. Change the account number if you are checking a different one.

6. Passphrase optional

A word or phrase added when your words become keys, deriving an entirely separate wallet. Nothing records it, so one wrong character opens a wallet that is real, empty, and not yours — check the master fingerprint below.

Called the 13th or 25th word, misleadingly: it is neither a word nor from the list. BIP39 passphrases covers choosing one, storing it, and when not to bother.

7. Your rolls

Estimated source entropy

Distribution checkoptional

These were not rolled

This page will not turn them into a wallet, because anyone could guess it. Here is what gave it away:

    If you really did roll these, then the die or the recording is at fault — check both, and roll a fresh set.

    The reverse is worth saying too. Getting past this check does not mean your randomness is good. It only means nothing here looks typed. Real dice produce long runs and odd clusters that feel wrong and are perfectly fine — never re-roll a result because it looks unrandom to you. That replaces the die's judgement with your own, and yours is predictable.

    Why coins, dice and cards are treated differently

    A coin gives exactly one bit, so 256 flips are 256 bits and go straight in unchanged. You can check that mapping by hand.

    A six-sided die face carries log₂(6) = 2.58 bits, which is not a whole number, so the rolls are hashed with SHA-256 instead and the result used as the entropy. That is what COLDCARD, SeedSigner, Krux and Gordian all do, and it is why 99 rolls is the number you see everywhere.

    Three dice at once sidestep the problem rather than solving it. Eight faces is three bits and sixteen is four, so an octal die and two hex dice throw 3 + 4 + 4 = 11 bits together — which is one word index exactly, with no remainder to hash away and no bias to correct. A 24-word seed takes 23 throws of all three dice, then one final octal throw to select among eight checksum-valid endings. A 12-word seed takes 11 three-dice throws, then one octal and one hex die to select among 128 endings. The printed dictionary names every word directly; the six-sided-die method instead needs 99 rolls and calculates a checksum you cannot see.

    Cards shorten as you draw them, which no other source here does. The first card is one of 52 and worth log₂(52) = 5.70 bits, the next one of 51, and so on — so a whole deck is 225.6 bits rather than 52 × 5.70, and one deck cannot fill a 24-word seed. Shuffle it and keep drawing. All three conversions above use every card: the two hash modes encode the same draw differently before SHA-256, while the bit-table mode reads the BIP39 tool’s codes, which run two, four or five bits long depending on the card.

    There is no standard here. Four of the conversions in use are offered above, and they disagree with each other on purpose: hashing the digits as rolled, hashing them after rewriting every 6 to a 0, reading them as bits without hashing at all, and looking each word up in a table. The same column of rolls produces four unrelated wallets. Others are not offered — BlueWallet packs bits its own way, and SeedSigner used a different method before February 2022 — so a mismatch against all four still does not mean your device is broken.

    Which is the point worth leaving with. Your recovery words are the backup. The column of rolls, flips or cards in your notebook is not, because what you wrote down does not say which of these conversions produced the wallet.

    How this page was checked

    The conversion, hashing, encoding and wallet-format code follows the published specifications. Public-key and Taproot curve operations use Bitcoin Core’s libsecp256k1 compiled to WebAssembly. The surrounding code and its library bridge can still be subtly wrong, so on load the page runs published test vectors and refuses to produce anything if they do not pass:

      The values come from FIPS 180-4, RFC 4231, BIP380, and the test vectors published in BIP32, BIP39, BIP84 and BIP86. None was produced by running this code.

      Sources

      This page claims that four named devices convert dice four different ways, and refuses to show a wallet unless it agrees with published test vectors. Both are checkable, so here are the published sources and the places where this Workshop adds its own conservative checks.

      These open in a new tab, because leaving this one would lose the rolls you have entered. They need a connection, which the tool itself never does.

      The conversions

      • Hash the rolls
        COLDCARD — Verifying dice roll math States the method outright — SHA-256 over the rolls as an ASCII string — and gives the 50 and 99 roll counts this page uses. Its worked example is one of the vectors in the self-test.
      • Hash, 6 as 0
        Keystone — Verifying a phrase created by dice rolling Keystone does not publish the mapping. It tells you to check against the BIP39 HTML tool with Dice entropy and 24 words set, and the source below is what that setting does: rewrite every 6 to a 0, then hash. The attribution here is that chain, not a claim from Keystone directly.
      • Bit table
        BIP39 HTML tool — entropy.js The base 6 (dice) table and the 6-to-0 rewrite before it. Read it with index.js, which chooses between two behaviours: a fixed word count hashes, while raw uses the table and keeps the last whole 32 bits. Same rolls, different wallets, which is why both are offered above.
      • Lookup table
        BitBox02 — Diceware lookup table All 2048 words as printed. This page’s index arithmetic was checked against every cell of it, not a sample. The procedure document gives the layout — first die the page, next three the row, fifth die and the coin the column — and the rule that 23 words are rolled and the last is chosen.
      • Octal and hex dice
        entropy.page — Roll Your Own Seed Phrase D++ and Keysa’s workshop, where this method comes from. Their dictionary is the specification and the one to print — it runs 100 to 8FF, which is why the octal die is read as 1 to 8. Cells checked against it end to end. The slide deck has the procedure.
      • Coin flips
        Nothing to cite. A flip is one bit, the bits are packed in the order you made them, and the whole mapping can be checked by hand against the raw entropy above.

      The specifications

      • Words and seeds
        BIP39 Entropy to words, the checksum that fixes the last one, the passphrase that changes the seed without changing the words, and the wordlist itself.
      • Keys from a seed
        BIP32 The derivation run to reach an address, and the vectors the page checks itself against on load.
      • Address types
        BIP44, BIP49, BIP84, BIP86 One per type, each giving both the standard path filled in above and the receive and change addresses used as vectors.
      • Address encoding
        BIP173, BIP350 bech32 and bech32m, which turn a public key into the bc1 strings shown above.
      • Hashes
        FIPS 180-4, RIPEMD-160 SHA-256 and SHA-512 from the first, RIPEMD-160 from its authors. Both are written out in this file rather than imported, and both are pinned by vectors from these documents.
      • HMAC and PBKDF2
        RFC 4231, RFC 2898 The 2048 rounds standing between your words and your seed, and the vectors showing this file runs them correctly.
      • Input-health checks
        NIST SP 800-90B, NIST chi-square goodness-of-fit, RFC 4086 Established references for repetition and proportion health checks, comparing observed outcome counts with an expected distribution, and the limitation that statistical tests do not establish unpredictability. The Workshop’s combined decision rule is not one of these standards.

      Inspired by EntropyLab.

      The refusal you get when a sequence looks typed rather than rolled is Workshop-specific, not an implementation of the standards above. Its repetition and dominant-value checks address the same health concerns documented by NIST, and its distribution calculation is Pearson chi-square; the period, step-pattern, compression and card-order heuristics, their thresholds and the combined decision are ours. A reproducible seeded exercise refused 0 of 1,000,000 ideal-model simulations across the supported input profiles; run npm run test:entropy -- --calibrate in the source repository to repeat it. That measures false refusals under those models. It cannot validate a physical entropy source or prove that an entered sequence is unpredictable — this remains a spellcheck, not a randomness test.

      Part of SelfCustody.ca. The full procedure and the rules that matter more than this tool does are in Roll the dice and Intro to Self Custody. How to read this page itself is in Bring Your Own Entropy.