Port of Gangleri42 SeedHammer composer + emulator to SeedHammer v1 hardware. Bundles a SeedSigner emulator with QR seed handoff.
Go to file
mineracks 14486455c6 Composer UX polish — live preview, plate-aware lines, hex layout
Live SVG preview of the plate, rendered from the same lineLayout
function as Encode so the visual always matches what gets engraved.
The preview shows the plate outline, both margin guides (outer 3mm /
inner 10mm), and each non-empty text block at its (XMM, YMM) anchor.

Plate-aware line counts: composerPlateTypes now reports `max_lines`
per plate (computed from H minus innerMargin minus textYStartMM,
divided by stride). UI hides input rows above that count and
restores them when a bigger plate is picked again — no data loss
on plate switch.

  Small  85×55  → 5 lines
  Square 85×85  → 9 lines
  Large  85×134 → 15 lines

textYStartMM bumped 5 → 11mm so the first line sits inside the
innerMargin safe-engrave guide (it was visibly outside before).
textXMM bumped 5 → 11mm for the same reason.

Hex dump:
  - 8 bytes per row instead of 16 (~33 chars wide, fits any column)
  - shorter offset prefix (auto-width by total size)
  - now a debug-only collapsible alongside the live size meter

Layout fixes:
  - .preview no longer hard-pinned to 1:1 aspect (lifted webnfc CSS
    was sized for SH-II's square plate)
  - main > * gets min-width: 0 so wide hex content can't inflate
    the grid column past its fr unit
  - html, body get overflow-x: hidden as a root-level safety net
  - text baseline now calculated as YMM + fontMM*0.78 instead of
    relying on dominant-baseline="hanging" — Safari renders the
    latter inconsistently which made Large-plate text invisible

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:07:06 +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 UX polish — live preview, plate-aware lines, hex layout 2026-05-28 20:07:06 +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 Composer UX polish — live preview, plate-aware lines, hex layout 2026-05-28 20:07:06 +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.