Skip to main content

SeedShield

A terminal viewer for BIP39 seed phrases that keeps every word masked until you deliberately reveal it. You enter word positions (1-2048); SeedShield shows the matching words from the BIP39 wordlist one at a time, and masks each one again after 3 seconds.

Key Features

Security

  • All words masked by default; a revealed word auto-masks after 3 seconds
  • Only one word is visible at a time
  • No log file by default; nothing about your session is written to disk (--verbose is opt-in and writes an owner-only seedshield.log)
  • Entered positions are never logged, even in verbose mode
  • Clipboard is cleared immediately after it is read
  • Screen is wiped before the terminal is restored, and the alternate screen is used, so revealed words don't remain in scrollback
  • Best-effort memory clearing on exit (see Limitations)
  • Strict input validation: a set of positions is either fully valid or rejected, so words are never silently skipped

User Interface

  • Enter several positions at once: 5 12 19 or 5,12,19
  • Sequential reveal mode (s)
  • Mouse: hover over or click a word to reveal it
  • Input from keyboard, clipboard or a file
  • Scrolling for long lists; handles terminal resizing
  • Linux and macOS; Windows via the optional windows-curses extra (not covered by CI)

Security Guidelines

Operating Environment

  • Use an air-gapped computer whenever possible
  • Prefer a clean, live Linux system; avoid shared or public computers
  • Mind your surroundings: cameras, reflections, people looking over your shoulder
  • Remember that a positions file on disk is your seed. Prefer typing positions, and securely delete any file you created.

Limitations

SeedShield is a Python program, so it can only reduce how long secrets stay in memory. It cannot guarantee this:

  • It overwrites the wordlist strings (which include every revealed word), the typed input and the clipboard text after use.
  • Python integers (the positions), intermediate string copies and curses' own screen buffers cannot be wiped reliably.
  • Positions are typed on the keyboard, so SeedShield offers no protection against keyloggers or a compromised machine.

Treat SeedShield as one layer of a careful process, not as a guarantee.

Installation

# From PyPI
pip install seedshield

# On Windows
pip install "seedshield[windows]"

# Docker (clipboard input is unavailable inside a container)
docker run -it --rm barlog951/seedshield

Usage

# Interactive mode
seedshield

# Load positions from a file (spaces, commas or newlines between positions)
seedshield -i positions.txt

# Use a custom wordlist (must have no blank lines or duplicates)
seedshield -w custom_words.txt

# Opt-in debug log (seedshield.log in the current directory, mode 0600)
seedshield --verbose

Input screen

  • Type one or more positions and press Enter: 5, 5 12 19 or 5,12,19
  • v + Enter: read positions from the clipboard (same format), then clear the clipboard
  • q + Enter: quit

Viewing screen

  • s - reveal the next word (sequential mode)
  • r - restart the sequence (shown after the last word)
  • n - enter new positions
  • q - quit, wiping the screen
  • ↑↓ - scroll
  • Mouse hover or click - reveal that word for 3 seconds

Development

git clone https://github.com/Barlog951/SeedShield.git
cd SeedShield
pip install -e ".[test]"

# Unit tests plus end-to-end tests that drive the real UI through a pty
pytest

# Quality checks
pylint seedshield && flake8 seedshield && mypy seedshield

Docker build

./build.sh                       # builds seedshield:<version> and seedshield:latest
docker run -it --rm seedshield   # interactive
docker run -it --rm -v "$(pwd)/positions.txt:/positions.txt:ro" seedshield -i /positions.txt

The image installs the package normally (no source tree) and runs as a non-root user.

Technical Architecture

  • Python 3.10+ with type hints throughout (mypy strict on definitions)
  • Unit tests with mocked curses plus pty-based end-to-end tests (~95% coverage)
  • Curses UI with guaranteed terminal cleanup; xterm mouse mode 1003 for hover
  • Releases are cut automatically by semantic-release from conventional commits on main

Code Organization

  • main.py - entry point and argument handling
  • secure_word_interface.py - coordinates input, display and state
  • input_handler.py - parses and validates positions (keyboard, clipboard, file)
  • display_handler.py - rendering and masking
  • state_handler.py - reveal state, navigation and timeouts
  • ui_manager.py - curses lifecycle, mouse setup and cleanup
  • secure_memory.py - best-effort memory and clipboard clearing
  • config.py - settings, constants and logging
  • data/english.txt - bundled BIP39 English wordlist

Disclaimer

SeedShield helps you view seed words more safely, but it cannot secure the machine it runs on. You are responsible for your operating environment. Do not rely on SeedShield as your only security measure.

License

Released under the MIT License. See the LICENSE file for complete terms.

Metadata

Release files for SeedShield 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for SeedShield 0.4.0
File Size Uploaded
seedshield-0.4.0.tar.gz 47.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for SeedShield 0.4.0
File Interpreter ABI Platform
seedshield-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 79.7 kB

Release files / seedshield-0.4.0.tar.gz

Download URL seedshield-0.4.0.tar.gz
Size 47.2 kB
Tags Source
SHA-256 checksum
How to use checksums
60966630b676d1737d39d2cae1c905fce4d2ef28e65be76a4a21171e72164628
BLAKE2b-256 checksum
How to use checksums
f84c8b304f0620eaad62800bdfe91272ad6fd0ff381e843ae5e7aad797ebe09c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / seedshield-0.4.0-py3-none-any.whl

Download URL seedshield-0.4.0-py3-none-any.whl
Size 32.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e8726d841dbce3a01254ce0adc4783e2d20551f817583e405ea799f153c7571c
BLAKE2b-256 checksum
How to use checksums
44283521419b111af2d60ee586f37323aa71b288790d6bb8e0a6f81f4c0a25d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.5.0

2 release files

0.4.1

2 release files

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.1.11

2 release files

0.1.10

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page