CLI REFERENCE · v0.2

SeedCrypt Recover — Command Reference

Every subcommand, every flag, defaults, examples. Open-source CLI distributed under the MIT license. Build it from source — no binaries are signed or hosted on this page.

← Back to overview

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.

From crates.io / GitHub (recommended)
# Install Rust if you don’t have it curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Clone & build the release binary git clone https://github.com/femto7/seedcrypt-recover cd seedcrypt-recover cargo build --release # Binary lives at: ./target/release/seedcrypt-recover --help

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

seedcrypt-recover [--help] [--version] <COMMAND>
FlagDescription
-h, --helpPrint help and exit.
-V, --versionPrint 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

seedcrypt-recover missing --mnemonic <STRING> [--address <ADDR>] [--passphrase <STRING>] [--account-start <NUM>] [--account-end <NUM>] [--address-start <NUM>] [--address-end <NUM>] [--allow-typo] [--checkpoint <PATH>] [--resume <PATH>]

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

FlagTypeDefaultDescription
--mnemonic REQUIREDstringThe full mnemonic with ? in place of each unknown word. Single-quote the whole string in your shell to protect spaces.
--address OPTIONALstringTarget wallet address. If absent, the tool stops at the first checksum-valid candidate. Strongly recommended: without it, many seeds pass the checksum.
--passphrasestring""BIP-39 25th-word passphrase. Empty by default. Case-sensitive; preserves Unicode normalization (NFKD).
--account-startu320First account index to test. Path m/PURPOSE'/COIN'/account'/0/i.
--account-endu320Last account index (inclusive). Increase if your wallet uses multiple accounts.
--address-startu320First address index to test per account.
--address-endu329Last address index (inclusive). Matches btcrecover's --addr-limit default.
--allow-typoflagfalseAlso 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).
--checkpointpathSave progress to this file periodically. Mutually exclusive with --resume. See Checkpoint & resume.
--resumepathContinue 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

1 — One missing word, no address (checksum-only)
Fastest mode. Returns the first of 128 (avg) checksum-valid candidates.
seedcrypt-recover missing \ --mnemonic "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon ?"
2 — One missing word, validated against an ETH address
Re-derives every checksum-valid candidate against your wallet — exactly one match.
seedcrypt-recover missing \ --mnemonic "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon ?" \ --address 0x9858EfFD232B4033E47d90003D41EC34EcaEda94
3 — Two missing words at known positions (BTC)
seedcrypt-recover missing \ --mnemonic "legal winner thank year wave sausage worth useful legal winner thank ?" \ --address bc1q9d4ywgfnd8h43da5tpcxcn6ajv590cg6d3tg6axemvljvt2k76zs50tv4q
4 — Missing word + BIP-39 passphrase + wide scan range
seedcrypt-recover missing \ --mnemonic "…" \ --address "…" \ --passphrase "YourPassphrase" \ --account-end 4 \ --address-end 49
5 — Missing word + --allow-typo (combined mode)
Position 11 is missing and position 10 (apple) may also be wrong. Only practical with exactly 1 missing word — see the flag description above.
seedcrypt-recover missing \ --mnemonic "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon apple ?" \ --address 0x9858EfFD232B4033E47d90003D41EC34EcaEda94 \ --allow-typo

typo — Fix a single-word typo

seedcrypt-recover typo --mnemonic <STRING> --address <ADDR> [--passphrase <STRING>] [--account-start <NUM>] [--account-end <NUM>] [--address-start <NUM>] [--address-end <NUM>] [--checkpoint <PATH>] [--resume <PATH>]

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

FlagTypeDefaultDescription
--mnemonic REQUIREDstringFull mnemonic, all words present. No ? placeholders. The one wrong word doesn't need to be a valid BIP-39 word itself.
--address REQUIREDstringTarget wallet address. Required because the original mnemonic is itself checksum-valid most of the time.
--passphrasestring""BIP-39 25th-word passphrase, same semantics as in missing.
--account-startu320First account index.
--account-endu320Last account index (inclusive).
--address-startu320First address index per account.
--address-endu329Last address index (inclusive).
--checkpointpathSave progress to this file periodically. Mutually exclusive with --resume. See Checkpoint & resume.
--resumepathContinue a search from a checkpoint written by --checkpoint. Mutually exclusive with --checkpoint.

Examples

1 — Single typo, ETH address
Word 11 is a genuine misspelling (abandun, not a real BIP-39 word) instead of abandon. Runs in <1 s on a modern CPU.
seedcrypt-recover typo \ --mnemonic "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandun about" \ --address 0x9858EfFD232B4033E47d90003D41EC34EcaEda94
2 — Typo + passphrase + scan multiple accounts
seedcrypt-recover typo \ --mnemonic "…" \ --address "…" \ --passphrase "correct horse battery staple" \ --account-end 2

reorder — Fix words that are correct but in the wrong order

seedcrypt-recover reorder --mnemonic <STRING> --permute-positions <LIST> --address <ADDR> [--passphrase <STRING>] [--account-start <NUM>] [--account-end <NUM>] [--address-start <NUM>] [--address-end <NUM>] [--checkpoint <PATH>] [--resume <PATH>]

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

FlagTypeDefaultDescription
--mnemonic REQUIREDstringFull mnemonic, all words present and individually correct. No ? placeholders.
--permute-positions REQUIREDlist1-indexed, comma-separated positions to permute (e.g. 3,7,9,10). 2–10 positions, no duplicates, all within 1..=seed_length.
--address REQUIREDstringTarget wallet address. Required — with all words individually valid, the checksum alone can't tell you which order is right.
--passphrasestring""BIP-39 25th-word passphrase, same semantics as in missing.
--account-startu320First account index.
--account-endu320Last account index (inclusive).
--address-startu320First address index per account.
--address-endu329Last address index (inclusive).
--checkpointpathSave progress to this file periodically. Mutually exclusive with --resume. See Checkpoint & resume.
--resumepathContinue a search from a checkpoint written by --checkpoint. Mutually exclusive with --checkpoint.

Examples

1 — Two swapped positions
Positions 11 and 12 are swapped (about should be last). Only 2 candidates to try — instant.
seedcrypt-recover reorder \ --mnemonic "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about abandon" \ --permute-positions 11,12 \ --address 0x9858EfFD232B4033E47d90003D41EC34EcaEda94
2 — More than 10 positions is rejected
The tool refuses rather than run an infeasible search — narrow to the positions you actually suspect.
seedcrypt-recover reorder \ --mnemonic "…" \ --permute-positions 1,2,3,4,5,6,7,8,9,10,11 \ --address "…" # Error: --permute-positions has 11 positions (11! candidates) — impractical. Narrow it to 10 or fewer.

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 --checkpoint writes 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 --resume command (if --checkpoint was set — otherwise it just reports how many candidates were tested, since nothing was saved), and exits with code 130.
  • --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-typo state — 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.
Start, then resume after an interruption
# Start, checkpointing periodically seedcrypt-recover missing --mnemonic "... ? ? ?" --address "0x..." \ --checkpoint progress.json # If interrupted (Ctrl+C, crash, reboot), continue with seedcrypt-recover missing --mnemonic "... ? ? ?" --address "0x..." \ --resume progress.json

Supported addresses (auto-detection)

Pass any of these to --address. The coin and derivation type are inferred from the prefix.

PrefixAddress kindCoin / 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 / P2SHLitecoin (LTC)
ltc1q…P2WPKHLitecoin native SegWit
D…P2PKHDogecoin (DOGE)
X…P2PKHDash
t1…Transparent P2PKHZcash (transparent only)
0x… (40 hex)Keccak-256 + EIP-55Ethereum / EVM (BSC, Polygon, Avalanche-C, Arbitrum, Optimism, Base)
T… (34 chars)SHA3 + Base58CheckTron (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.
  • 0 with "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 --resume checkpoint that doesn't match this invocation, etc.
  • 130 — Interrupted (Ctrl+C) before completion. Standard "terminated by SIGINT" exit code. If --checkpoint was set, prints the exact --resume command 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 --address when possible — without it, missing stops 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 --mnemonic with 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 + about instead, which derives the public ETH address 0x9858EfFD232B4033E47d90003D41EC34EcaEda94.
  • Always pass --checkpoint for 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.