Port of Gangleri42 SeedHammer composer + emulator to SeedHammer v1 hardware. Bundles a SeedSigner emulator with QR seed handoff.
Go to file
mineracks a42a410fd3 Composer: SH-03 mid-hole at Y=45 (upper-third, not centerline)
User confirmed: the two extra clamping holes on the SH-03 long sides
sit at the upper-third position, not the geometric centerline that
I was rendering. Matches the engraved sample plate photos where the
"DISMISS / MUSEUM" row appears just below the middle hole pair.

  before: middle holes at (3, 67) and (82, 67)   ← geometric centre
   after: middle holes at (3, 45) and (82, 45)   ← upper-third

Constants picked up by holePositions(). SH-01 and SH-02 still 4-corner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:45:49 +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 Composer: SH-03 mid-hole at Y=45 (upper-third, not centerline) 2026-05-28 20:45:49 +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 #5 SH1E Pi-side decoder + fuzz harness 2026-05-28 20:41:34 +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 #4 v1 emulator scaffolding — boots in browser 2026-05-28 20:38:43 +10:00
seedqr Lift composer substrate from upstream v1.3.0 2026-05-28 18:36:40 +10:00
web #4 v1 emulator scaffolding — boots in browser 2026-05-28 20:38:43 +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.