Deterministic dot‑pattern encoding for BIP39 seed phrases.
NOTE: This project was generated with Cookiecutter along with @clamytoe's toepack project template.
SeedDots provides a deterministic, reversible way to encode BIP39 seed phrases into compact dot‑patterns suitable for metal stamping, engraving, or visual backup.
Unlike QR codes or random patterns, SeedDots produces human‑verifiable, symbol‑agnostic, space‑efficient encodings that can be reconstructed even from partial damage.
SeedDots converts each word of a BIP39 mnemonic into a compact, 3‑column dotmap. It’s a human‑portable obfuscation layer designed for secure backups, metal plates, and offline storage systems like OneKey stamping plates.
The dotmap is fully reversible, deterministic, and symbol‑set agnostic.
- 🔐 Encode BIP39 seed phrases into deterministic dotmaps
- 🔄 Decode dotmaps back into seed phrases
- 🧩 Verification of encoded/decoded output
- 🖨️ Printable stamping cards (Markdown, PNG, or SVG)
- 🧱 Multiple symbol sets: dot, ascii, block, rune
- 📋 Clipboard support for fast workflows
- 🧪 Clean, modular architecture (
encoder.py,utils.py,dotmap.py) - 🔒 Zero external dependencies for encoding/decoding
Clone the repository:
cd Projects
git clone https://github.com/clamytoe/seeddots.git
cd seeddotsIf you are an Anaconda user, this command will get you up to speed with the base installation.
conda env create -f environment.yml
conda activate seeddotsIf you are just using normal Python, this will get you ready, but I highly recommend that you do this in a virtual environment. There are many ways to do this, the simplest using venv.
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txtpip install -e .seeddots --help
Usage: seeddots [OPTIONS] COMMAND [ARGS]...
SeedDots — Encode and decode BIP39 seed phrases into dotmaps.
Options:
--help Show this message and exit.
Commands:
decode Decode a dotmap back into a mnemonic phrase.
encode Encode a mnemonic phrase into a dotmap.
logo Print or save the SeedDots logo.
preview Preview the dotmap for a single word.
printcard Generate a printable stamping card for OneKey plates.
symbol-key Show symbol set mappings.seeddots encode "abandon ability able about above absent"seeddots encode --from-clipboard --copy-outputseeddots decode --file dotmap.txtAvailable sets can be viewed with the following command:
seeddots symbol-key
dot: ● = 1 ○ = 0
ascii: 1 = 1 0 = 0
block: █ = 1 ░ = 0
rune: ⊙ = 1 ∘ = 0Then, preview with the following command:
seeddots encode --file examples/sample_seed.txt --preview-symbols "block"
🔐 BIP39 Dotmap Encoding
┏━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┓
┃ Index ┃ Word ┃ Column 1 ┃ Column 2 ┃ Column 3 ┃
┡━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━┩
│ 1586 │ shiver │ ░ █ █ ░ │ ░ ░ █ █ │ ░ ░ █ ░ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1757 │ swear │ ░ █ █ ░ │ █ █ ░ █ │ █ █ ░ █ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1170 │ mutual │ ░ █ ░ ░ │ █ ░ ░ █ │ ░ ░ █ ░ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 399 │ crack │ ░ ░ ░ █ │ █ ░ ░ ░ │ █ █ █ █ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1056 │ loop │ ░ █ ░ ░ │ ░ ░ █ ░ │ ░ ░ ░ ░ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1291 │ pattern │ ░ █ ░ █ │ ░ ░ ░ ░ │ █ ░ █ █ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 110 │ asset │ ░ ░ ░ ░ │ ░ █ █ ░ │ █ █ █ ░ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1650 │ soda │ ░ █ █ ░ │ ░ █ █ █ │ ░ ░ █ ░ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1123 │ middle │ ░ █ ░ ░ │ ░ █ █ ░ │ ░ ░ █ █ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 1235 │ olympic │ ░ █ ░ ░ │ █ █ ░ █ │ ░ ░ █ █ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 351 │ cloth │ ░ ░ ░ █ │ ░ █ ░ █ │ █ █ █ █ │
├───────┼──────────┼──────────┼──────────┼──────────┤
│ 633 │ excuse │ ░ ░ █ ░ │ ░ █ █ █ │ █ ░ ░ █ │
└───────┴──────────┴──────────┴──────────┴──────────┘seeddots printcard --file seed.txt --format markdownseeddots printcard "gravity lunar ritual ..." --format svg --output card.svgEach BIP39 word has a deterministic index (1–2048). SeedDots converts that index into a 12‑bit binary string, then maps each bit to a symbol (● or ○, 1 or 0, etc.) in three 4‑bit columns.
Example:
word: abandon
index: 1
binary: 000000000001
dotmap: ○○○○ ○○○○ ○○○●seeddots/
├── encoder.py # Pure encoding/decoding logic
├── utils.py # I/O, verification, card generation
├── dotmap.py # CLI interface
├── data/
│ └── bip39_english.txt
└── tests/ # pytest suiteSeedDots does not store, transmit, or log seed phrases. All encoding/decoding happens locally on your machine.
This tool is an obfuscation layer, not a replacement for proper key security.
Distributed under the terms of the MIT license, "seeddots" is free and open source software — do whatever you want, just don’t blame me if you brick your wallet.
Pull requests, feature ideas, and symbol‑set suggestions are welcome.
Tests can be run with with pytest -v, please ensure that all tests are passing and that you've checked your code with the following packages before submitting a pull request:
- black
- flake8
- isort
- mypy
- pytest-cov
I am not adhering to them strictly, but try to clean up what's reasonable.
⭐ Acknowledgments
Inspired by metal seed plate stamping workflows and the desire to create a reversible, human‑friendly encoding system for secure backups.
If you encounter any problems, please file an issue along with a detailed description.
- v0.1.0 Initial commit.

