A clean, self-contained browser wallet with a robust ApiServer backend.
Feel free to modify and use it in your own projects.
Live example: https://webwallet.bitwebcore.net
| Type | Format | Standard |
|---|---|---|
| Legacy | 1... |
P2PKH |
| Segwit (wrapped) | 3... |
P2SH-P2WPKH |
| Native SegWit | btw1q... |
P2WPKH (Bech32) |
| Taproot | btw1p... |
P2TR (Bech32m) |
All four types are available in Settings. HD derivation follows BIP44/49/84/86 per type.
Private keys never leave the browser. The wallet connects to an Electrum-based ApiServer for balance, UTXO and broadcast — it requires a live connection to function. No ApiServer, no wallet.
UTXO-level transaction building: manually select which outputs to spend, sort by amount / confirmations / type / status. Selection persists in localStorage between sessions.
Dedicated History tab showing incoming and outgoing transactions with amounts, confirmations and timestamps pulled from the ApiServer.
Ships a Web App Manifest and a minimal Service Worker — install directly from the browser address bar on desktop or mobile. No app store required. The Service Worker exists solely to satisfy the browser's install prompt requirement; asset caching is intentionally absent.
The wallet loads three pre-built browser bundles from website/js/. None of them are fetched from a CDN — all are vendored into the repo. Each bundle is fully reproducible from source using the pinned build guide in the repo root.
| File | Contents | Build guide |
|---|---|---|
bitcoin-bundle-v7.min.js |
bitcoinjs-lib v7, ecpair, @noble/curves, Buffer polyfill, BIP341 taproot signer | BUILD_Bitcoinjs.md |
bip39-bundle.min.js |
@scure/bip39, @scure/bip32, HD key derivation | BUILD_bip39.md |
qrcode-browser.min.js |
QR code canvas renderer | BUILD_qrcode_browser.md |
All three bundles use only MIT-licensed dependencies. Build reproducibility is verified by SRI hashes documented in each guide.
| Package | Version | License |
|---|---|---|
| bitcoinjs-lib | 7.0.1 | MIT |
| ecpair | 3.0.1 | MIT |
| @noble/curves | 2.2.0 | MIT |
| @scure/bip39 | 2.2.0 | MIT |
| @scure/bip32 | 2.2.0 | MIT |
| buffer | 6.0.3 | MIT |
| qrcode | 1.5.4 | MIT |
| bootstrap | 5.x | MIT |
| jquery | 3.x | MIT |
| socket.io (client) | 4.8.1 | MIT |
- All cryptographic RNG goes through
window.crypto.getRandomValues(Web Crypto API → OS CSPRNG).Math.randomis absent from all bundles — verified by the build guides. - Private key material (seed, root HDKey, child HDKey, taproot tweak) is zeroed with
fill(0)after use throughoutwallet.jsand the bundle entry points. - The BIP341 taproot signer (
bitcoin.taproot.makeKeySigner) is co-located with the secp256k1 adapter inentry_bundle.jsso all tweak arithmetic is auditable in one place. @noble/curvesand@scure/bip32/@scure/bip39are audited by Cure53.
Originally inspired by OutCast3k's coinbin.