Getting Started
Three paths to a running pool:
- Docker — multi-arch image, runs on Umbrel-Box, NAS, or any Linux/macOS host
- Native Binary —
.deb/.rpm/.dmg/.msi/.AppImagefor bare-metal hosts and Raspberry Pi 5 - From Source — for development or verification
Prerequisite in every case: a running Bitcoin Core (≥27.0 recommended) with
the getblocktemplate RPC and ZMQ block-notify enabled. GBT is the default
template source. Bitcoin Core ≥31 additionally offers an experimental
Cap’n-Proto IPC interface, which the pool can use as an opt-in alternative
template source ([node].template_source = "ipc") for a faster template step —
see Configuration Reference.
Docker
docker run -d \
--name warppool \
--restart unless-stopped \
-p 18334:18334 \
-p 3333:3333 \
-v ~/.warppool:/data \
git.warppool.org/dvb-projekt/dvb-warppool:latest
Add -p 3334:3334 (V1 TLS) and -p 34254:34254 (Stratum V2) if you enable
those listeners.
The container’s default entrypoint is the daemon, so the pool UI comes up at
http://localhost:18334. To run the first-run wizard (auto-detects hardware,
suggests a profile, tests the Bitcoin RPC) instead, start the container with the
wizard binary:
docker run --rm -it -p 8331:8331 -v ~/.warppool:/data \
git.warppool.org/dvb-projekt/dvb-warppool:latest \
dvb-warppool-setup --bind 0.0.0.0:8331
Native Binary
Raspberry Pi 5 (aarch64)
# arm64 .deb
wget https://git.warppool.org/dvb-projekt/dvb-WarpPool/releases/download/v1.24.0/dvb-warppool_1.24.0-1_arm64.deb
sudo dpkg -i dvb-warppool_1.24.0-1_arm64.deb
sudo systemctl enable --now dvb-warppool
Storage recommendation: NVMe-HAT > USB-3 SSD > industrial SD. The SQLite WAL
plus shares_raw eviction is hard on SD cards under sustained pool load.
macOS / Linux x86_64
Tarball/pkg from the releases page.
The macOS .dmg is not signed with an Apple Developer ID and not notarized
(that is on the roadmap as phase B), so Gatekeeper flags the download. Strip the
quarantine attribute from the .dmg and from the installed app:
xattr -dr com.apple.quarantine ~/Downloads/dvb-WarpPool-v*.dmg
# …mount, drag to /Applications, then:
xattr -dr com.apple.quarantine /Applications/dvb-WarpPool.app
From Source
git clone https://git.warppool.org/dvb-projekt/dvb-WarpPool
cd dvb-WarpPool
cargo build --release --workspace
./target/release/dvb-warppool-setup # first-run wizard on :8331
Build artifacts land in target/ as usual. If your checkout lives inside a
syncing folder (iCloud Drive, Dropbox, …), point cargo somewhere local instead —
either export CARGO_TARGET_DIR=~/.cache/dvb-WarpPool/target or a personal,
git-ignored .cargo/config.toml with [build] target-dir = …. Adjust the
binary path above accordingly.
Stratum V1 vs V2
The pool can run all three listeners side by side in one process. Only the plain V1 listener is on by default; the other two start once they are configured:
- V1 plain (
:3333) — all existing miner firmwares - V1 TLS (
:3334) — ifstratum_tls_listen+ cert/key are set in config.toml - V2 NOISE-NX (
:34254) — ifsv2_listenis set. Requiressv2_authority_priv_key_hexinsecrets.toml; generate it withdvb-warppool-cli gen-sv2-key. Without the key Sv2 stays disabled with a warning in the log.
The V1 TLS and Sv2 ports are free to choose — :3334 and :34254 are just the
values used throughout this handbook. The connect modal in the UI always shows
the exact host:port the running instance listens on.
For V1-miner sidecars (e.g. when the pool should expose only Sv2 externally):
the bundled dvb-warppool-translator binary. See
Phase History → 7.4.
Both transports also support the per-worker payout mode (each miner mines to
its own address from the Stratum login) and the public wallet pages at
/users/<address>. See Public 0% Solo Pool.
First Block
- Configure your miner with
stratum+tcp://<pool-host>:3333as the pool - Use your BTC receive address as the worker name (e.g.
bc1q...) - Open the pool UI at
http://<pool-host>:18334 - The pool hashrate chart shows shares live; the
/blockstab shows found blocks
When a block lands → BlockFoundEvent runs immediately through
bitcoin-rpc::submit_block and the notifier sends ntfy / Telegram /
Discord / Slack / Email / browser push.
Reading the hashrate chart
The 24-hour dashboard chart shows two things at once, on two axes:
- The filled area line is the pool hashrate, estimated from accepted shares in 1-minute buckets, read against the left axis (auto-scaled — H/s, KH/s, … up to TH/s).
- The amber dots are best-share peaks — for each time bucket, the highest real share difficulty seen in it — plotted against a separate right axis (share difficulty, scaled K/M/G/T…). They are not on the left hashrate axis.
The line and the dots answer different questions: the line is how much work is flowing, a dot is how close the best share in that slice came to solving a block. The higher a dot, the rarer that share; the all-time best also appears as Best Share on the dashboard. This is the share’s real hash difficulty, independent of the VarDiff target the miner runs at.
The dots come from the per-bucket peak difficulty carried in /api/hashrate —
hover the chart to read the value for that slice. The right axis and the dots
only appear on the full chart once at least one peak has been recorded; mini
charts and a brand-new pool show the line only. After upgrading from an older
version the dots fill in over the first ~24 h, as peak data is recorded going
forward.
Next Steps
- Configuration Reference — all config.toml fields
- Public 0% Solo Pool — per-worker mode (each miner mines
to its own address) + public wallet pages at
/users/<address> - Notifications — set up notifier sinks
- Observability — Prometheus endpoint + Grafana
- Troubleshooting — when something isn’t working