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 master 95565ee (2026-06-05, the commit the Umbrel app pins), and mkpool master 9f73edc (2026-06). The VarDiff and suggest_difficulty rows 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-WarpPoolckpool (solo)public-poolmkpool
CoinsBitcoinBitcoinBitcoin9 chains (BTC, BCH, LTC, DOGE merge-mined, ZEC, …)
Starting difficultyhardware-aware, 8 device classes from user agent42, fixed100,000, fixedfixed per port tier (SV2: seeded from miner's nominal hashrate)
Sub-1 difficultyfrom the first share (NerdMiner class)no (min 1)only via a slow descent, below 5 lifetime sharesno (floor 1; configured floors 1024)
Difficulty persistencesurvives reconnects and pool restartsnonono
suggest_difficulty / d=both, clamped to the device class; a repeat or below-current suggest is deduped and treated as a seed, not continuous controlsuggest only (applied every time, but deduped before send)suggest unclamped, one-shot (latched); d= integer, upward onlyboth, clamped per coin — but re-emits set_difficulty (+ a job re-push) on every repeat
VarDiff styleEMA + Poisson significance gate (retarget only when the share-rate clears a 1/√N confidence band) + guarded idle decay, per-class floorsEMA + fixed 0.15–0.4 share-rate hysteresis band60 s timer + ±2× hysteresis, power-of-2 snapsEMA + fixed hysteresis (faithful ckpool re-impl)
Fixed-difficulty portsno — VarDiff adapts per devicevia separate instancesnoyes (one fixed-diff TCP port per tier)
Stratum V22024 spec, live-verified (Bitaxe / NerdQAxe)nonot in master (side branch)2024 spec (NX, EllSwift, encrypted)
TLS for minersout of the box + Let's Encrypt guidenonoyes (in-binary)
Block/coinbase standardsBIP34 height, SegWit commitment, BIP310 version-rolling (overt ASICBoost) — plus a BIP54-forward-compatible coinbase locktime (Consensus-Cleanup-ready ahead of activation)BIP34, SegWit, version-rollingBIP34, SegWit, version-rollingBIP34, SegWit, version-rolling
Multi-node failoveryes — sub-second switch, submitblock to all nodes in parallelyes (failover list)nono (config field present but unused in src/)
Block-change latencyZMQ from every configured node, first winsZMQ + polling fallbackZMQZMQ + polling fallback + watchdog
Rate-limit / auto-banper-IP on connect/auth/API + escalating ban + manual block listminimalminimaltoken-bucket + invalid-share ban
Web UI / APIPWA, 8 languages, authenticated, live SSEnone (logs + unix socket)yes (API unauthenticated, CORS open)none in the open release (engine + Postgres writer only)
Prometheus /metricsyes (pool + per-miner + network)nonoyes (opt-in build flag)
Notifications5 sinks + Web Push; friends can subscribenoneTelegram/Discord, block-found onlynone in the open release
Device telemetryBitaxe / Antminer / Avalon / Whatsminer probes + mDNSnonono
Energy & solar trackingyesnonono
Tests1006, gating every release in CInone in repo63, not run in CICatch2 + ASan/TSan/UBSan, but no CI
Releasessigned checksums; .dmg / .msi / .deb / .rpm / AppImage / multi-arch Docker; reproducible + SBOMbuild from sourceno tags or releasesbuild from source, no tags
Mainnet track recordnot yet — the project is youngmany (hosted, since 2014)yes (hosted)hosted instance live on mainnet
LicenseAGPLv3 + commercialGPLv3GPLv3 (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