Comparison: dvb-WarpPool vs. ckpool vs. public-pool vs. mkpool
Choosing a self-hosted solo pool comes down to a handful of open-source candidates. This page compares them feature by feature so you can pick the right tool for your setup.
How this table was made — and how to read it fairly:
- Every claim was verified against the source code of the compared
projects, not against their marketing: ckpool master
a01fcb3e(2026-06-07), public-pool master95565ee(2026-06-05, the commit the Umbrel app pins), and mkpool master9f73edc(2026-06). The VarDiff andsuggest_difficultyrows were re-verified against current source on 2026-06-23. dvb-WarpPool claims reflect the current release. - All four are actively maintained open-source projects making different trade-offs. ckpool has been the workhorse of solo mining for a decade (the hosted solo.ckpool.org has found hundreds of mainnet blocks); mkpool is a modern multi-coin C++ engine; public-pool is the familiar TypeScript pool with a web UI. Nothing here means "those are bad."
- The table tracks what ships in the open-source code. Hosted
instances (solo.ckpool.org, public-pool.io, mkpool.com) run additional
private code you don't get when self-hosting — mkpool's README states its
database/analytics service, REST API and website are not in the open
release, so those rows reflect the engine only. Where a project's README
claims a feature its open code doesn't implement, we go by the code
(e.g. mkpool lists multi-node failover, but the relevant config field has
no consumers in
src/). - Competitor repos move. If a cell is outdated, open an issue — this page is only useful while it's accurate. Last updated: 2026-06-23.
| dvb-WarpPool | ckpool (solo) | public-pool | mkpool | |
|---|---|---|---|---|
| Coins | Bitcoin | Bitcoin | Bitcoin | 9 chains (BTC, BCH, LTC, DOGE merge-mined, ZEC, …) |
| Starting difficulty | hardware-aware, 8 device classes from user agent | 42, fixed | 100,000, fixed | fixed per port tier (SV2: seeded from miner's nominal hashrate) |
| Sub-1 difficulty | from the first share (NerdMiner class) | no (min 1) | only via a slow descent, below 5 lifetime shares | no (floor 1; configured floors 1024) |
| Difficulty persistence | survives reconnects and pool restarts | no | no | no |
suggest_difficulty / d= | both, clamped to the device class; a repeat or below-current suggest is deduped and treated as a seed, not continuous control | suggest only (applied every time, but deduped before send) | suggest unclamped, one-shot (latched); d= integer, upward only | both, clamped per coin — but re-emits set_difficulty (+ a job re-push) on every repeat |
| VarDiff style | EMA + Poisson significance gate (retarget only when the share-rate clears a 1/√N confidence band) + guarded idle decay, per-class floors | EMA + fixed 0.15–0.4 share-rate hysteresis band | 60 s timer + ±2× hysteresis, power-of-2 snaps | EMA + fixed hysteresis (faithful ckpool re-impl) |
| Fixed-difficulty ports | no — VarDiff adapts per device | via separate instances | no | yes (one fixed-diff TCP port per tier) |
| Stratum V2 | 2024 spec, live-verified (Bitaxe / NerdQAxe) | no | not in master (side branch) | 2024 spec (NX, EllSwift, encrypted) |
| TLS for miners | out of the box + Let's Encrypt guide | no | no | yes (in-binary) |
| Block/coinbase standards | BIP34 height, SegWit commitment, BIP310 version-rolling (overt ASICBoost) — plus a BIP54-forward-compatible coinbase locktime (Consensus-Cleanup-ready ahead of activation) | BIP34, SegWit, version-rolling | BIP34, SegWit, version-rolling | BIP34, SegWit, version-rolling |
| Multi-node failover | yes — sub-second switch, submitblock to all nodes in parallel | yes (failover list) | no | no (config field present but unused in src/) |
| Block-change latency | ZMQ from every configured node, first wins | ZMQ + polling fallback | ZMQ | ZMQ + polling fallback + watchdog |
| Rate-limit / auto-ban | per-IP on connect/auth/API + escalating ban + manual block list | minimal | minimal | token-bucket + invalid-share ban |
| Web UI / API | PWA, 8 languages, authenticated, live SSE | none (logs + unix socket) | yes (API unauthenticated, CORS open) | none in the open release (engine + Postgres writer only) |
Prometheus /metrics | yes (pool + per-miner + network) | no | no | yes (opt-in build flag) |
| Notifications | 5 sinks + Web Push; friends can subscribe | none | Telegram/Discord, block-found only | none in the open release |
| Device telemetry | Bitaxe / Antminer / Avalon / Whatsminer probes + mDNS | no | no | no |
| Energy & solar tracking | yes | no | no | no |
| Tests | 1006, gating every release in CI | none in repo | 63, not run in CI | Catch2 + ASan/TSan/UBSan, but no CI |
| Releases | signed checksums; .dmg / .msi / .deb / .rpm / AppImage / multi-arch Docker; reproducible + SBOM | build from source | no tags or releases | build from source, no tags |
| Mainnet track record | not yet — the project is young | many (hosted, since 2014) | yes (hosted) | hosted instance live on mainnet |
| License | AGPLv3 + commercial | GPLv3 | GPLv3 (UI repo: no license file) | GPLv3 |
When the others are the better pick
Honesty cuts both ways:
- ckpool — a minimal, battle-hardened C daemon with a decade of track record, if you're comfortable with logfiles and a unix socket as your interface. It needs the least trust in young code.
- public-pool — the exact software behind public-pool.io, a familiar UI, and a large user base running the same commit.
- mkpool — if you want multi-coin solo mining (BTC, BCH, LTC, merge-mined DOGE, ZEC and more from one binary), fixed-difficulty ports, or a lean modern C++ engine, and you don't need a built-in operator UI, device telemetry, or packaged/signed releases. It's already live on mainnet.
- dvb-WarpPool — if you run mixed home hardware (NerdMiner next to a Bitaxe next to an Avalon), want TLS / SV2 / notifications / energy tracking and a full operator UI without bolting on extra services, and value tested, signed, reproducible releases. Bitcoin-only by design.
See also
- Performance Benchmarks — measured numbers behind the claims, including the 1,000-miner load test
- Scaling Tiers — what this pool is and isn't designed for
- Getting Started