[BREAKGLASS] Self-Contained Multisig Steel Bitcoin Wallet Backups https://seedetcher.com
Go to file
2026-03-12 08:43:19 +01:00
.vscode Fixed build errors 2025-03-01 18:38:33 +01:00
address Fix change derivation for descriptors using explicit /0/* 2025-12-10 13:32:14 +01:00
bc fix(fountain): harden seq length handling and validate decoded headers 2026-03-04 18:45:34 +01:00
bip32 renamed from seedhammer to seedetcher 2025-01-23 01:45:19 +01:00
bip39 all: use "tools" tag instead of "ignore" tag for generator tools 2024-11-16 14:09:02 +01:00
cmd release tooling: streamline mkRelease and stamped image output 2026-03-03 20:26:27 +01:00
descriptor test(urxor): add golden payload vectors and full 3of5 recovery combinations 2026-02-21 19:11:43 +01:00
docs docs(b0.4): add scene debug outputs and file-first laser workflow 2026-03-12 08:43:19 +01:00
driver Remove engraving stack and switch to printer-only flow 2025-12-06 18:25:51 +01:00
font license: migrate to Apache-2.0 and add SeedEtcher font OFL metadata 2026-03-03 21:02:35 +01:00
gui release tooling: streamline mkRelease and stamped image output 2026-03-03 20:26:27 +01:00
image renamed from seedhammer to seedetcher 2025-01-23 01:45:19 +01:00
logutil Nailed multisig plate and descriptor layout 2025-03-06 18:04:59 +01:00
nonstandard fix(codeql): resolve remaining integer conversion and overflow alerts 2026-02-17 11:25:44 +01:00
patches flake.nix: upgrade to libcamera 0.0.5 2023-05-17 07:18:04 -06:00
printer printer: align direct PCL/PS output with host-mode cutbox geometry 2026-03-03 14:53:39 +01:00
scripts docs: update workflow and add PDF export tooling 2026-03-04 15:21:47 +01:00
seedqr renamed from seedhammer to seedetcher 2025-01-23 01:45:19 +01:00
testutils Fix 2x2 progress math and add nested script fixtures 2026-03-03 14:31:43 +01:00
version chore(release): prepare v0.3.0-beta.1 2026-02-18 11:42:14 +01:00
zbar fix(codeql): resolve remaining integer conversion and overflow alerts 2026-02-17 11:25:44 +01:00
.gitignore release tooling: streamline mkRelease and stamped image output 2026-03-03 20:26:27 +01:00
CHANGELOG.md docs: update release notes and contributor docs 2026-03-03 20:37:50 +01:00
CONTRIBUTING.md docs(compliance): add third-party license tracker and release-note template 2026-03-03 21:26:22 +01:00
flake.lock Issue with upgrading to gofpdf v2 2025-03-05 20:31:59 +01:00
flake.nix release tooling: streamline mkRelease and stamped image output 2026-03-03 20:26:27 +01:00
go.mod chore(go): tidy module deps after printer cleanup 2026-02-26 18:02:24 +01:00
go.sum chore(go): tidy module deps after printer cleanup 2026-02-26 18:02:24 +01:00
init.sh refactor(cups): rename spike runtime paths to cups-runtime 2026-02-26 16:24:14 +01:00
LICENSE license: migrate to Apache-2.0 and add SeedEtcher font OFL metadata 2026-03-03 21:02:35 +01:00
NOTICE license: migrate to Apache-2.0 and add SeedEtcher font OFL metadata 2026-03-03 21:02:35 +01:00
README.md Added Trademark 2026-03-12 08:32:04 +01:00
testgopdf.go Issue with upgrading to gofpdf v2 2025-03-05 20:31:59 +01:00
THIRD_PARTY_LICENSES.md docs(compliance): add third-party license tracker and release-note template 2026-03-03 21:26:22 +01:00
TRADEMARK.md Added Trademark 2026-03-12 08:32:04 +01:00

SeedEtcher Self-Contained Multisig Steel Bitcoin Wallet Backups

SeedEtcher is an open-source, air-gapped system for creating durable Bitcoin backups by printing seed phrases, descriptors, and QR codes with a standard laser printer and permanently etching them into metal. It minimizes trust and attack surface by relying on offline hardware, simple materials, and a transparent, reproducible workflow instead of expensive dedicated machines. Once you get the hang of the workflow a double-sided plate can be done in 1.52h.

Starting with version b0.3 prep-time and etch time halved!

The following things were substantially improved or added:

  • Multisig uses descriptor-share backups (no full descriptor on a single plate). These wallet configs default to UR/XOR-compatible shares: 1/2, 2/2, 2/3, 2/4, 4/4, 3/5, and any n-1/n. This replaces b0.2's custom SE1 Shamir share method for interoperability. All other wallet types stay on full descriptor.
  • All Brother lasers are supported (even host-based). PCL/PS remains the recommended way to print. HBP (host based printing) is capped to 600dpi (memory limit of pi zero) All other brands that support true PCL or PostScript should work too. See: printers.md
  • Print output can be sent non-inverted and non-mirrored for checking before printing to transfer paper.
  • A new method (SeedEtcher Transfer Stack™) leverages the use of silicone sheets to reliably transfer toner masks to both sides of a metal plate at once. This means, you can also etch both sides at once!
  • A new plate layout design optimizes for etching. All rounded forms, including a custom designed font face and QRs with circle modules. Also the mask area now covers the whole plate except for the side where you tape it for transfer. This means you only need to tape one side before etching.
  • I designed a 3d printable etching container for optimal etching performance. No manual movement required. It will be released after geyser.io campaign, presumably.
  • Improved etching method by using 30% FeCl3 at 40°C. It can be made from 40% by diluting it with distilled water.
  • For folks who want to electro etch, there is an optional stats page with A/cm2 calculations that can be printed additionally. (I am still researching the optimal electro etching workflow.)

The project consists of:

1) SeedEtcher Controller

Raspberry Pi Zerobased controller firmware that drives a standard laser printer over USB. Scan seed and descriptor QR codes offline and print deterministic layouts for etching.

2) SeedEtcher Workflow

A documented, repeatable workflow for chemically etching printed layouts onto steel.

  • Print to transfer paper
  • Heat-transfer toner to metal
  • Etch steel

SeedEtcher-Workflow.md


Features

  • Multisig uses descriptor-share backups (no full descriptor on a single plate). These wallet configs default to UR/XOR-compatible shares: 1/2, 2/2, 2/3, 2/4, 4/4, 3/5, and any n-1/n. Other multisig configurations output the full descriptor.
  • The SeedEtcher controller has a descriptor recovery mode and is able to scan them directly from the metal plates.
  • Manual mnemonic input with validation (bip39)
  • GUI-driven, with physical button navigation
  • Outputs plates layouts with words + QR codes directly via serial USB
  • Laser print → toner transfer → acid etching for steel backup
  • Debugging via serial shell and PDF capture on host or UART in host mode

Documentation

  • docs/overview.md — purpose, architecture, file map
  • docs/development.md — build, debug, printing, Nix config

Flash SeedEtcher to SD-card

Download the img file from the release page on github

Use balena etcher or via cmd line:

MacOS:

diskutil unmountDisk /dev/diskX
sudo dd if=result/seedetcher.img of=/dev/rdiskX bs=1m
diskutil eject /dev/diskX

Build & Deploy for debugging (Quick Start)

(see build-matrix.md for target builds)

nix build .#image-gadget-debug

Flash to SD card:

diskutil unmountDisk /dev/diskX
sudo dd if=result/seedetcher-gadget-debug.img of=/dev/rdiskX bs=1m
diskutil eject /dev/diskX

Run controller on Pi: ./controller < /dev/ttyGS1 >> /log/debug.log 2>> /log/debug.log &


License

Licensed under Apache License 2.0: LICENSE and NOTICE Third-party component licenses: THIRD_PARTY_LICENSES.md

SeedEtcher™ and SeedEtcher Transfer Stack™ are trademarks of the SeedEtcher project.

The Apache License 2.0 applies only to the code, documentation, and design files in this repository and does not grant rights to use the SeedEtcher name, logos, or branding.


Legacy

This is a fork of seedhammer