Single-file airgapped transaction signer for Polkadot/Kusama.
- Airgapped: Webcam QR in → QR out, no USB/clipboard needed
- Self-Contained: Single 938KB HTML file, works completely offline
- Ledger Compatible: BIP32-Ed25519, Legacy + Generic derivation modes
The tool will NOT work unless:
- ✓ Opened as local file (
file://protocol) - ✓ Internet is disconnected (offline mode)
Recommended Setup:
- Download
index.htmlto USB stick - Boot Tails OS from USB
- Disconnect all network (WiFi + ethernet)
- Open the HTML file in Tails browser
- The tool will verify you're offline before showing the form
Minimum Setup:
- Save
index.htmlto your computer - Disconnect from internet completely
- Open the file directly (file://)
- Red security warning will block usage if online
Airgapped Workflow:
- Online: Create extrinstic → Show QR (papi.how)
- Offline: Scan QR → Sign TX → Show QR
- Online: Scan QR → Broadcast(pjs/curl rpc)
Manual Workflow:
- Online: Copy unsigned TX hex
- Offline: Paste → Sign → Copy signed hex
- Online: Paste → Broadcast
Derivation: BIP32-Ed25519 (Ledger compatible)
Paths: Legacy m/44'/434'/0'/0'/0' | Generic m/44'/434'/0'/0/0
Networks: Kusama (434) | Polkadot (354)
Signing: Ed25519 via @noble/ed25519
npm install && npm run buildAuto-deploys to GitHub Pages + IPFS on push to master.
Setup:
# Add Pinata JWT secret
gh secret set API_JWT --body "eyJhbGc..."
# Enable IPFS deployment
gh variable set ENABLE_IPFS_DEPLOY --body "true"
# Enable GitHub Pages: Settings → Pages → Source: GitHub ActionsApache-2.0