docs(machine): document the on-machine QR-pairing wizard
Note the wizard flow next to VITE_SPIRE_SEED + a dedicated Pairing section (aiolabs/bitspire#52): unpaired → scan seed off camera → persist + relaunch → normal boot pairs. Records the qr-over-jsqr choice rationale by reference. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
aca6aebcb6
commit
b9340f7754
1 changed files with 21 additions and 1 deletions
22
CLAUDE.md
22
CLAUDE.md
|
|
@ -84,12 +84,32 @@ Renderer reads (Electron IPC or Vite `import.meta.env`):
|
|||
|---|---|---|
|
||||
| `VITE_RELAY_URL` | yes | `ws://...` of the relay both ATM and LNbits subscribe to. Dev: `ws://localhost:5001/nostrrelay/test` (LNbits's bundled `nostrrelay` extension — no separate strfry container) |
|
||||
| `VITE_LNBITS_SERVER_PUBKEY` | yes | 64-char hex pubkey LNbits prints on startup (`docker logs lnbits \| grep 'Public key (share this)'`) |
|
||||
| `VITE_SPIRE_SEED` | yes (prod) | Spire pairing seed (`spire-seed:v1:<base64url>`) from spirekeeper. Carries a one-shot NIP-46 connect token + the spire signing pubkey + bunker URL. First boot redeems it and persists the binding to `state.db`; later boots resume by fingerprint. A changed seed re-pairs. See aiolabs/bitspire#52. |
|
||||
| `VITE_SPIRE_SEED` | yes (prod) | Spire pairing seed (`spire-seed:v1:<base64url>`) from spirekeeper. Carries a one-shot NIP-46 connect token + the spire signing pubkey + bunker URL. First boot redeems it and persists the binding to `state.db`; later boots resume by fingerprint. A changed seed re-pairs. Provisioning it up front is optional — an unpaired machine renders an on-screen QR-pairing wizard that scans the seed off the camera (see below). See aiolabs/bitspire#52. |
|
||||
| `VITE_ATM_PRIVATE_KEY` | dev only | 64-char hex raw nsec fallback for running without a bunker. Ignored when `VITE_SPIRE_SEED` or a stored binding exists. |
|
||||
| `VITE_OPERATOR_PUBKEYS` | optional | Comma-separated hex pubkeys allowed to send kind-21003 management commands |
|
||||
|
||||
The LP-era vars (`VITE_LIGHTNING_PUB_PUBKEY`, `VITE_LIGHTNING_PUB_API_URL`, `VITE_EXTENSION_API_URL`, `VITE_ADMIN_TOKEN`) are gone from the dev branch's `.env.example` and `LightningConfig` interface.
|
||||
|
||||
## Pairing (on-machine QR wizard)
|
||||
|
||||
A machine with no seed **and** no stored binding boots `unpaired` and, under
|
||||
Electron, renders an interactive wizard (`src/components/PairingWizard.vue`)
|
||||
instead of a dead-end fault screen. The operator displays the `spire-seed`
|
||||
QR (minted by spirekeeper's `/pair`) to the machine's camera; the wizard:
|
||||
|
||||
1. captures + decodes via a `PairingSource` (`src/services/pairing/`) — camera
|
||||
today (decode through `qr`, paulmillr's zero-dep lib), NFC scaffolded;
|
||||
2. validates the scan parses as a spire-seed (`ingestScannedSeed`), rejecting
|
||||
a stray QR;
|
||||
3. persists it as `VITE_SPIRE_SEED` via the `state:save-spire-seed` IPC and
|
||||
relaunches (`app:relaunch`).
|
||||
|
||||
Pairing itself is **not** done in the wizard — relaunch lets the normal boot
|
||||
path (`signer-resolver` → `connectNewSeed`) redeem the one-shot token, so
|
||||
there's one tested pairing path. A revoked/expired binding lands on the same
|
||||
wizard (re-pair = scan a fresh seed). Provisioning `VITE_SPIRE_SEED` up front
|
||||
still works and skips the wizard.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue