Port of Gangleri42 SeedHammer composer + emulator to SeedHammer v1 hardware. Bundles a SeedSigner emulator with QR seed handoff.
Go to file
mineracks 2755a685d1 #1 QR display — composer becomes end-to-end useful
New JS export from cmd/composer:
  composerQR(plateType, lines) -> {svg, modules, bytes}

Encodes the design as SH1E (same path as Encode), then runs the
bytes through kortschak/qr at medium error-correction level (15%
damage tolerance — sensible for a phone-screen-to-camera handoff).
Returns an inline SVG of the QR matrix with a 4-module quiet zone
baked in, drawn as horizontal-run rects (one per dark run, NOT one
per cell — ~half the markup).

UI: a new orange primary button "Show QR" beside the debug bytes
button. Click → fullscreen overlay with the QR centred on a white
card, byte/module count below, and a close button. Click outside
the card or hit Escape to dismiss.

This is the Phase 1 unlock that turns the composer from "interesting
demo" into "I can hold my phone up to a SeedHammer v1 and engrave
this plate". Single-frame QR for SH1E payloads up to ~200 bytes
(well above the typical 90B for a 12-word seed plate). BBQr for
multi-plate manifests comes later.

WASM grew 3.4MB → 3.6MB from pulling in the QR encoder. Acceptable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:10:47 +10:00
address Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
backup Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
bc Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
bezier Lift bezier/ + bspline/ from Gangleri42 fork 2026-05-28 18:29:29 +10:00
bip32 Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
bip39 Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
bspline Lift bezier/ + bspline/ from Gangleri42 fork 2026-05-28 18:29:29 +10:00
cmd #1 QR display — composer becomes end-to-end useful 2026-05-28 20:10:47 +10:00
docs Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
driver/mjolnir Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
engrave SH1E v0.1 reference encoder + decoder + tests 2026-05-28 18:51:16 +10:00
font Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
gui Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
image Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
input Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
internal/golden Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
nonstandard Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
platform/v1 Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
seedqr Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
web #1 QR display — composer becomes end-to-end useful 2026-05-28 20:10:47 +10:00
.gitignore Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
CREDITS.md Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
go.mod Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
go.sum Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
LICENSE Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00
README.md Initial skeleton — Phase 1 scaffolding 2026-05-28 18:25:03 +10:00

seedhammer-v1-companion

Status: early development. Phase 1 (composer port) in progress. See docs/architecture/ for the project plan and design docs.

A browser-based companion for SeedHammer v1 hardware (the original Raspberry-Pi-Zero-based engraver), inspired by Gangleri42's SeedHammer II fork. Ships three coordinated tools and one optional desktop wrapper.

What this is

1. Plate composer (browser PWA)

Design a stainless steel seed-backup plate from your phone or desktop — seed words, custom title text, optional logos — then transfer the design to a real SeedHammer v1 controller via QR code.

The composer renders a pixel-faithful preview using the same Go code the Pi controller runs. What you see in the browser is what the engraver will physically punch.

The on-the-wire envelope is SH1E (a CBOR + CRC32 format documented at docs/architecture/sh1e-spec.md). Sized to fit a 24-word multisig plate in a single QR frame, with BBQr fallback for larger multi-plate manifests.

2. SeedHammer v1 emulator (browser PWA)

Run the real v1 controller firmware in your browser. The same gui/, input/, and engrave/ Go packages that drive the physical device, compiled to WASM. Use it to:

  • Test workflows end-to-end without a physical device
  • Take screenshots / record screencasts of v1 flows
  • Demo SeedHammer v1 to people without shipping hardware

Keyboard mapping: arrows = joystick, Enter = center/confirm, 1/2/3 = Button1/2/3.

3. Bundled SeedSigner emulator (browser PWA)

A faithful in-browser SeedSigner — both the classic 1.3" 240×240 model and the newer 2.8" SeedSigner+ "jumbo" model. Generates seed-phrase QR codes that you can hand off to the SeedHammer v1 emulator via a single button press, end-to-end without leaving the page.

Built by hosting the upstream SeedSigner Python code via Pyodide so that the emulator IS the firmware — when SeedSigner releases new versions we bump the pinned commit and the sim updates.

4. Optional Android wrapper

Kotlin/Gradle shell hosting the composer WASM, for users who want a plate-design app instead of a PWA. Mirrors the structure of Gangleri42's SH2 Android companion.

Hardware targeted

This codebase targets the original SeedHammer v1 specifically — the [Pi Zero v1.3 / WaveShare 1.3" 240×240 LCD HAT / MarkingWay engraver] hardware. Not the newer SeedHammer II (RP2040 / TinyGo / SH2E NFC).

For an SH-II companion, use Gangleri42's fork directly. Most of the inspiration for this project comes from there.

Status & roadmap

  • Phase 1 — composer port (Go-to-WASM, SH1E reference encoder, web UI)
  • ☐ Phase 2 — v1 emulator (firmware-in-browser, Gangleri42-faithful UI shell)
  • ☐ Phase 2.5 — SeedSigner emulator + QR handoff
  • ☐ Phase 3 — combined three-pane sim
  • ☐ Phase 4 — real-device validation on real v1 hardware
  • ☐ Phase 5 (optional) — ColdCard emulator (port from Gangleri42's fork)
  • ☐ Phase 6 (optional) — Android wrapper

Building

(Will be documented as Phase 1 lands — go build ./... + a Vite build for the web shells.)

License

Released under the Unlicense (public domain dedication), matching upstream SeedHammer's choice. SeedSigner-derived files segregated and retain their MIT notice.

Credits + provenance

Heavy lifting by three upstreams. See CREDITS.md for what came from where and the pinned baseline commits.