Install & build
SeedCrypt Recover is distributed as Rust source code only — there are no pre-built binaries. Install Rust (rustup) and build with Cargo. Same instructions are used on macOS, Linux, and Windows.
For air-gapped use, run cargo vendor on a connected machine, then transfer the directory and pass --offline on the air-gapped host.
Global options
| Flag | Description |
|---|---|
| -h, --help | Print help and exit. |
| -V, --version | Print version and exit. |
Subcommands: missing · typo · reorder. All three accept --checkpoint <path>/--resume <path> for long searches — see Checkpoint & resume.
missing — Recover N missing words at known positions
Replace each unknown word with ? in the mnemonic. Up to 3 missing words are supported (20484 = 17 billion combinations is impractical). The mnemonic must contain 12, 15, 18, 21, or 24 words total. Without --address, the tool returns the first BIP-39 checksum-valid candidate (cheap but ambiguous). With --address, every checksum-valid candidate is re-derived along all six standard derivation paths (BIP-44/49/84/86 for BTC-likes, m/44'/60' for ETH, m/44'/195' for TRX) and validated against your address. Add --allow-typo if you're not sure the missing word is the only thing wrong — see the combined example below.
Flags
| Flag | Type | Default | Description |
|---|---|---|---|
| --mnemonic REQUIRED | string | — | The full mnemonic with ? in place of each unknown word. Single-quote the whole string in your shell to protect spaces. |
| --address OPTIONAL | string | — | Target wallet address. If absent, the tool stops at the first checksum-valid candidate. Strongly recommended: without it, many seeds pass the checksum. |
| --passphrase | string | "" | BIP-39 25th-word passphrase. Empty by default. Case-sensitive; preserves Unicode normalization (NFKD). |
| --account-start | u32 | 0 | First account index to test. Path m/PURPOSE'/COIN'/account'/0/i. |
| --account-end | u32 | 0 | Last account index (inclusive). Increase if your wallet uses multiple accounts. |
| --address-start | u32 | 0 | First address index to test per account. |
| --address-end | u32 | 9 | Last address index (inclusive). Matches btcrecover's --addr-limit default. |
| --allow-typo | flag | false | Also try substituting one known (non-?) word with each of its 2048 alternatives, in addition to filling the ? slots. Multiplies the search space by roughly 1 + known_words × 2048 — the tool refuses to run if the combined total exceeds 500 million candidates (in practice, only usable with exactly 1 missing word). |
| --checkpoint | path | — | Save progress to this file periodically. Mutually exclusive with --resume. See Checkpoint & resume. |
| --resume | path | — | Continue a search from a checkpoint written by --checkpoint. Mutually exclusive with --checkpoint. Refuses to proceed if the checkpoint's parameters don't match this invocation. |
Examples
--allow-typo (combined mode)apple) may also be wrong. Only practical with exactly 1 missing word — see the flag description above.typo — Fix a single-word typo
All words are present but one is wrong. The tool tries every position × all 2048 BIP-39 words — total ≈ N × 2048 candidates (25 k for a 12-word seed, 49 k for 24 words). This covers both a genuine misspelling (a word that isn't in the BIP-39 wordlist at all, e.g. abandun) and a valid-but-wrong word (e.g. apple instead of abandon) — at most one wrong word at a time; two unresolvable words are rejected. Always pair this with --address: without validation, the original (wrong) seed itself passes the checksum and you’d get a false positive.
Flags
| Flag | Type | Default | Description |
|---|---|---|---|
| --mnemonic REQUIRED | string | — | Full mnemonic, all words present. No ? placeholders. The one wrong word doesn't need to be a valid BIP-39 word itself. |
| --address REQUIRED | string | — | Target wallet address. Required because the original mnemonic is itself checksum-valid most of the time. |
| --passphrase | string | "" | BIP-39 25th-word passphrase, same semantics as in missing. |
| --account-start | u32 | 0 | First account index. |
| --account-end | u32 | 0 | Last account index (inclusive). |
| --address-start | u32 | 0 | First address index per account. |
| --address-end | u32 | 9 | Last address index (inclusive). |
| --checkpoint | path | — | Save progress to this file periodically. Mutually exclusive with --resume. See Checkpoint & resume. |
| --resume | path | — | Continue a search from a checkpoint written by --checkpoint. Mutually exclusive with --checkpoint. |
Examples
abandun, not a real BIP-39 word) instead of abandon. Runs in <1 s on a modern CPU.reorder — Fix words that are correct but in the wrong order
Every word is correct, but you suspect a subset of positions got shuffled — e.g. you wrote them down out of order. --permute-positions takes 2–10 positions (1-indexed, comma-separated) and tries every permutation of just those positions, leaving everything else fixed. The search space is k! where k is the number of marked positions — a full 12-word permutation (12! ≈ 479 million) is impractical, but marking only the 2–5 positions you actually suspect keeps it to a handful of candidates.
Flags
| Flag | Type | Default | Description |
|---|---|---|---|
| --mnemonic REQUIRED | string | — | Full mnemonic, all words present and individually correct. No ? placeholders. |
| --permute-positions REQUIRED | list | — | 1-indexed, comma-separated positions to permute (e.g. 3,7,9,10). 2–10 positions, no duplicates, all within 1..=seed_length. |
| --address REQUIRED | string | — | Target wallet address. Required — with all words individually valid, the checksum alone can't tell you which order is right. |
| --passphrase | string | "" | BIP-39 25th-word passphrase, same semantics as in missing. |
| --account-start | u32 | 0 | First account index. |
| --account-end | u32 | 0 | Last account index (inclusive). |
| --address-start | u32 | 0 | First address index per account. |
| --address-end | u32 | 9 | Last address index (inclusive). |
| --checkpoint | path | — | Save progress to this file periodically. Mutually exclusive with --resume. See Checkpoint & resume. |
| --resume | path | — | Continue a search from a checkpoint written by --checkpoint. Mutually exclusive with --checkpoint. |
Examples
about should be last). Only 2 candidates to try — instant.Checkpoint & resume
All three subcommands accept --checkpoint <path> and --resume <path> (mutually exclusive) so a long search survives a crash, Ctrl+C, or reboot.
- Starting fresh with
--checkpointwrites progress to<path>periodically (roughly every 100,000 candidates) as the search runs. The write is atomic (temp file + rename) — a crash mid-write never corrupts the checkpoint. - Pressing Ctrl+C stops the search gracefully, prints a ready-to-paste
--resumecommand (if--checkpointwas set — otherwise it just reports how many candidates were tested, since nothing was saved), and exits with code130. --resume <path>loads the checkpoint and continues from its saved index. It refuses to proceed if the checkpoint's signature — mode, mnemonic pattern, address, passphrase, derivation range,--allow-typostate — doesn't exactly match this invocation's, so you can't accidentally resume into a different search.- The checkpoint file never stores your passphrase or mnemonic in plaintext — both are stored as SHA-256 hashes, used only to verify a resume matches the original search.
Supported addresses (auto-detection)
Pass any of these to --address. The coin and derivation type are inferred from the prefix.
| Prefix | Address kind | Coin / standard |
|---|---|---|
| 1… | P2PKH (legacy) | BTC, BCH, BSV / BIP-44 |
| 3… | P2SH (nested SegWit) | BTC / BIP-49 |
| bc1q… | P2WPKH (Bech32) | BTC native SegWit / BIP-84 |
| bc1p… | P2TR (Bech32m) | BTC Taproot / BIP-86 |
| L… M… | P2PKH / P2SH | Litecoin (LTC) |
| ltc1q… | P2WPKH | Litecoin native SegWit |
| D… | P2PKH | Dogecoin (DOGE) |
| X… | P2PKH | Dash |
| t1… | Transparent P2PKH | Zcash (transparent only) |
| 0x… (40 hex) | Keccak-256 + EIP-55 | Ethereum / EVM (BSC, Polygon, Avalanche-C, Arbitrum, Optimism, Base) |
| T… (34 chars) | SHA3 + Base58Check | Tron (TRX) |
Match is case-insensitive for hex characters. EIP-55 mixed-case is preserved but not enforced. If the prefix isn’t recognized, the command fails fast with "Could not detect address type".
Exit codes & output
0— Recovery succeeded. Prints the full mnemonic, total candidates tested, and elapsed time.0with "No match found" — Search space exhausted with no checksum-and-address match. Try widening--account-end/--address-end, or check the passphrase.1— Invalid input: malformed mnemonic, unknown address prefix, too many?placeholders, a--resumecheckpoint that doesn't match this invocation, etc.130— Interrupted (Ctrl+C) before completion. Standard "terminated by SIGINT" exit code. If--checkpointwas set, prints the exact--resumecommand to continue.
On success, the recovered seed is printed to stdout as a single line. The tool intentionally does NOT write the seed to disk — capture it manually if you need to persist it.
Practical tips
- Always pass
--addresswhen possible — without it,missingstops at the first checksum-valid candidate, which is rarely the right one. - Try the default range first — most wallets use account 0, addresses 0–9 (HD wallets generate fresh receive addresses, so a used wallet typically has index 0 unused but earlier indexes match older receives).
- Use a freshly-booted air-gapped machine for highest-value recoveries. The binary doesn’t need internet at runtime.
- Test before trusting — pair
--mnemonicwith a known seed and known address first, to confirm the build works on your hardware. - Don’t paste your real seed publicly — even when "just for testing". Use the BIP-39 test vector
abandon× 11 +aboutinstead, which derives the public ETH address0x9858EfFD232B4033E47d90003D41EC34EcaEda94. - Always pass
--checkpointfor anything in the "hours or days" range — a 3-missing-word or wide-scan-range search can genuinely take that long, and an unattended machine will eventually reboot or lose power. See Checkpoint & resume.
Out of scope
- Password recovery (the BIP-39
--passphrase): the tool accepts a known passphrase but does not brute-force it. - Non-secp256k1 chains: Solana (ed25519), Cardano (ed25519), Polkadot (sr25519), Cosmos, Stellar, Algorand. Those need separate tooling.
- Hardware-wallet-specific anti-tamper schemes (Trezor SLIP-39 sharding, Ledger Recover, etc.). SeedCrypt Recover only handles standard BIP-39 mnemonics.
- Cracking AES-256-GCM payloads from the SeedCrypt app — that’s the encryption product, not this recovery tool. AES-256-GCM is unbreakable; if you’ve lost the password, no offline tool will recover it.