Electrum proxy with scheduled Bitcoin transaction broadcast
Inspired by Craig Raw's Broadcast Pool proposal.
πͺπΈ LΓ©eme en espaΓ±ol
Broadcast Pool (BP) is an Electrum proxy that runs on your node and sits between your wallet and your Electrum server. When your wallet broadcasts a transaction, BP retains it instead of forwarding it immediately and schedules it to be broadcast later β at the block, date or Bitcoin price you decide.
Built for bitcoiners who want to manage their signed transactions with fine-grained control over when and how they reach the mempool. All without leaving your node.
- Wallet migrations: spread the moves across blocks or days so there's no obvious "everything moved at once" footprint
- Cycle today what you'd cycle a year from now, with
nLockTimeset for anti-fee-sniping (privacy indistinguishable from regular wallets) - Emergency collateral for Bitcoin loans: schedule automatic collateral if the price drops below a threshold, to avoid liquidations
- UTXO management distributed over time: scheduled sweeps, consolidations and batches
- Compatible with any Electrum wallet: Sparrow, Liana, Nunchuk, Electrum, etc.
- Mainnet, testnet and signet
- Three scheduling modes:
- By block (height)
- By date (MTP β Median Time Past)
- By Bitcoin price (via CoinGecko or local on-chain oracle)
- Auto-discovery of local Electrum servers and price oracles (Umbrel, Start9)
- Auto-scheduling when a wallet signs with future
nLockTime - NIP-44 encrypted vault (Nostr) for history: only decryptable with your nsec key
- Responsive web UI (mobile and desktop)
- No telemetry, no tracking: your node, your data, your transactions
- Faking blockheight for Liana: BP can show Liana (and other wallets) a fake block height so they sign transactions with
nLockTimemonths β or years β in the future, improving on-chain privacy. Liana doesn't validate PoW (only chain continuity), so this works without breaking the flow.
- Open the Umbrel App Store
- Go to Community App Stores β Add Store
- Paste:
https://github.com/semillabitcoin/umbrel-app-store - Install Broadcast Pool
Broadcast Pool is not yet in the official Start9 marketplace, so installation is via manual sideload:
- Download the
.s9pkfor your architecture from releases:broadcast-pool_x86_64.s9pk(Intel/AMD PCs / servers)broadcast-pool_aarch64.s9pk(Raspberry Pi / ARM)
- In StartOS: Marketplace > Sideload β upload the
.s9pk
β οΈ About updates on Start9: sideloaded apps don't auto-update. Each new version requires downloading the updated.s9pkand sideloading it again. We're working on getting into the official Start9 registry to fix this.
docker run -d \
--name broadcast-pool \
-p 4040:4040 \
-p 50005:50005 \
-v $(pwd)/data:/data \
-e ELECTRUM_HOST=your-electrum-server \
-e ELECTRUM_PORT=50001 \
-e APP_SEED=your-32-char-random-seed \
ghcr.io/semillabitcoin/broadcast-pool:latestgit clone https://github.com/semillabitcoin/broadcast-pool
cd broadcast-pool
pip install -r requirements.txt
python3 -m src.mainEnvironment variables:
| Variable | Default | Description |
|---|---|---|
WEB_PORT |
4040 |
Web dashboard port |
PROXY_PORT |
50005 |
Electrum proxy port (TCP) |
WEB_BIND |
127.0.0.1 |
Web interface bind address |
ELECTRUM_HOST |
127.0.0.1 |
Upstream Electrum server host |
ELECTRUM_PORT |
50001 |
Upstream Electrum server port |
ELECTRUM_SSL |
false |
Use SSL with upstream |
DB_PATH |
data/pool.db |
SQLite database path |
APP_SEED |
(empty) | Key to encrypt txs at rest |
BP_AUTH_TOKEN |
(empty) | API auth token (optional) |
ββββββββββββ ββββββββββββββββ
β Wallet β ββββ Electrum ββββΆβ BP proxy β
β (Sparrow β βββββ return ββββββ :50005 β
β Liana) β ββββββββ¬ββββββββ
ββββββββββββ β
β broadcast intercepted
βΌ
ββββββββββββββββ
β Retention β
β (SQLite) β
ββββββββ¬ββββββββ
β
βββββββββββββββββββΌββββββββββββββββββ
βΌ βΌ βΌ
βββββββββββ βββββββββββ ββββββββββββ
β Block β β MTP β β Price β
β trigger β β trigger β β trigger β
ββββββ¬βββββ ββββββ¬βββββ ββββββ¬ββββββ
βββββββββββββββββββ΄ββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββ
β Electrum upstream β
β (your node) β
ββββββββββββββββββββββ
- Your wallet connects to BP's proxy (port 50005) instead of directly to your Electrum server
- When you broadcast a transaction, BP intercepts it, saves it to its database and returns the
txidto the wallet (which thinks it was broadcast) - The wallet sees the tx as pending in its virtual mempool (BP serves it consistently to the Electrum server)
- You decide from the dashboard when to broadcast it: at a specific block, a date (MTP), or when the price crosses a threshold
- When the condition is met, BP broadcasts the tx to the network via your node's Electrum
All configuration is done from the Settings tab of the web dashboard:
- Electrum server connection: auto-detects local servers (Electrs, Fulcrum) or configure one manually
- How to accumulate transactions: shows the address your wallet should connect to
- Behavior: auto-scheduling, price-based broadcast, faking blockheight
- Encrypted vault (Nostr): configure an
npubto store the encrypted history - Other preferences: language (ES/EN), unit (BTC/sats)
- Stack: Python 3.12 + asyncio + aiohttp + SQLite (WAL mode)
- Three components: Electrum TCP proxy (
src/proxy/), block/price scheduler (src/scheduler/), web API + dashboard (src/web/) - Encryption:
APP_SEEDencrypts retained transactions at rest (AES + HMAC)- NIP-44 encrypts confirmed history in the Nostr vault
- No external runtime dependencies: everything runs inside the container
- Persistence: SQLite with WAL for concurrency between proxy, scheduler and API
- Multi-arch: amd64 + arm64 builds (Raspberry Pi compatible)
- Zero trust with upstream: BP doesn't send any sensitive data to the Electrum server beyond what's strictly required by the protocol
- No telemetry, no tracking, no analytics
- Encrypted
raw_hexin SQLite whenAPP_SEEDis set - Optional API auth via
BP_AUTH_TOKEN(Umbrel/Start9 already handle proxy-level auth) - Vault only decryptable by the user: BP uses asymmetric cryptography based on Nostr keys
- Audited: ongoing security review. Report issues at GitHub Issues
- Set
APP_SEEDto a strong random value (Umbrel and Start9 generate it automatically) - Use a burner npub for the Nostr vault, not your main identity
- Don't expose the Electrum proxy (50005) over Tor or public networks
Pull requests welcome. Issues and feedback at GitHub Issues.
git clone https://github.com/semillabitcoin/broadcast-pool
cd broadcast-pool
pip install -r requirements.txt
python3 -m src.main
# Dashboard at http://localhost:4040- Craig Raw β original Broadcast Pool proposal and Sparrow Wallet author
- Wizardsardine β Liana Wallet (Miniscript pioneer)
- Start9 Labs β StartOS and SDK
- Umbrel β umbrelOS and App Framework
- Bitcoin community
MIT β Built in Semilla Bitcoin's rabbit hole π³οΈπ