Port of Gangleri42 SeedHammer composer + emulator to SeedHammer v1 hardware. Bundles a SeedSigner emulator with QR seed handoff.
Go to file
mineracks daac2d8ac5 #2 Pixel-faithful Comfortaa preview
Replace the system-monospace SVG <text> placeholder with actual
bitmap-glyph rendering from font/comfortaa.Regular16 — the same
16-pixel Comfortaa face the v1 firmware ships on the LCD. Every
"on" pixel in the bitmap becomes part of a horizontal-run <rect>
inside a transform="translate scale" group, so the preview is
pixel-identical to what the device's screen would show.

Implementation (cmd/composer/main.go):

- faceForFont(FontID, sizePt) -> *bitmap.Face
  Maps SH1E font IDs to bitmap faces. Today everything resolves
  to comfortaa.Regular16 — Poppins/Constant fall back until we
  wire their faces in.

- renderTextRowBitmap(sb, lineLayout)
  Two-pass over the text:
    1. Walk to compute total pixel width (advance + kerning) for
       horizontal alignment math.
    2. Emit one <g> with translate to (l.XMM, l.YMM + ascent*scale)
       and scale = fontMM / 16. For each glyph: AlphaAt threshold
       at 0x80, coalesce horizontal runs into single rects.
  Threshold-binary (not grayscale) because the engraver itself
  is binary — a pixel either gets punched or it doesn't.

Updated preview-note to reflect the new fidelity: "Each pixel in
the preview corresponds to a pixel the engraver will punch."

WASM size 3.6 → 3.5 MB (the simple <text> SVG → bitmap rect SVG
swap is roughly even; font binary data was already linked).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:13:44 +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 #2 Pixel-faithful Comfortaa preview 2026-05-28 20:13:44 +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 #2 Pixel-faithful Comfortaa preview 2026-05-28 20:13:44 +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.