Shape your signer -- browser-based management UI for the Heartwood ESP32 signing device.
Connect your Heartwood via USB, open sapwood.dev in Chrome, and manage your signing device from the browser. No server, no install, no dependencies.
Sapwood connects directly to the ESP32 via the Web Serial API (Chrome/Edge 89+). It speaks the Heartwood frame protocol over USB -- the same protocol used by the provision CLI and bridge. No server component, no bridge required.
Browser (Sapwood) --Web Serial--> ESP32 USB-Serial-JTAG
The frame protocol is a TypeScript port of heartwood-common/src/frame.rs, with 19 tests verifying byte-level compatibility with the Rust implementation.
Secrets never leave the ESP32. The serial protocol only carries public keys, policy metadata, unsigned events, and signatures. All destructive operations (factory reset, OTA, provisioning) require physical button confirmation on the device. A compromised web UI cannot extract keys or perform destructive actions without someone pressing the button.
Visit forgesworn.github.io/sapwood in Chrome or Edge, plug in your Heartwood, and click Connect USB.
git clone https://github.com/forgesworn/sapwood.git
cd sapwood
npm install
npm run dev # dev server at localhost:5173
npm test # 19 frame protocol tests
npm run build # production build to dist/
Sapwood is part of the Heartwood signing device ecosystem:
| Component | Role |
|---|---|
| Heartwood | ESP32 firmware + bridge + provision CLI |
| Sapwood (this repo) | Web management UI |
| Bark | Browser extension for NIP-46 signing |
| nsec-tree | Key derivation library |
Named after the living, active layer of wood between bark and heartwood.
Web Serial API is required. Currently supported in:
Firefox and Safari do not support Web Serial. BLE connectivity for portable mode is planned.
MIT