dvb-WarpPool — open-source solo mining pool written in Rust (Umbrel / macOS / Windows / Linux)

dvb-WarpPool v1.12.2 — the energy dashboard stays fast even after months of solar data

A small, honest performance patch — relevant if you run your solar/PV system alongside the pool:

  • The problem. With solar tracking enabled, the energy dashboard splits consumed energy into “solar” vs. “grid”. The query behind it joined a per-minute solar table to the miner telemetry on a computed key — which SQLite could only resolve as a nested-loop full scan. After a few months of PV history that took several seconds per call, and the dashboard runs it on a ~30s cadence → the log filled with “slow statement” warnings.
  • The fix. The split now runs as a correlated per-bucket query, driven off the telemetry and backed by the solar table’s primary-key index. Result: hundreds of times faster (the hourly daily-rebuild ~2000×), and the computed kWh figures are byte-identical — only the speed changes, not a single number.

Honest framing: a pure performance fix for solar pools — no new feature, no hashrate or earnings effect, no behaviour or config change. If you don’t use solar tracking you were never affected and see nothing change (the solar table is empty). If you do run PV, your energy dashboard is snappy again and your log is quiet. 1021 tests green, reproducible build as always.

dvb-WarpPool v1.13.0 — access controls for your Stratum endpoint, built-in backups, and explorer links

This release is all about operations & hardening — every piece optional and off by default:

  • Decide who may mine. Four new, individually toggleable gates: a payout-address allowlist (only your own addresses may mine), an IP allow/deny gate over CIDR ranges, a per-IP connection limit, and an automatic ban for a worker that keeps sending rejected shares. Your local network and the pool UI are never affected. Nothing changes for solo-at-home use — these gates are for anyone opening their pool to others, or who just wants one more layer of defense.
  • Built-in scheduled backups. The pool can now write its own periodic backups on a schedule (with a retention count) — no external cron, no script needed. Off by default; enable it under [backup].
  • One-click block lookups. Found-block hashes and heights now link straight to a block explorer (mempool.space by default, fully configurable) — one click instead of copy-pasting into a search bar.

Honest framing: a pure operations & hardening release. None of these features touch your hashrate or your block chances, and none is on by default — change nothing and you have exactly the pool you had before. 1037 tests green, reproducible build as always.

dvb-WarpPool v1.14.0 — finally see WHY shares get rejected (per worker, V1 + V2)

A small but practical release: per-worker reject reasons.

  • The problem. Until now you only saw a bare number per miner: “X rejected shares”. Whether those came from stale shares at block/job changes, from a too-high difficulty, from ntime drift, or from a real misconfiguration — invisible. A reject rate without the reason is a black box.
  • What’s new. /api/workers now returns a per-worker breakdown by reason (stale-share, low-difficulty, invalid-ntime, duplicate-share, … including the Sv2 pre-checks like job-not-found), sorted by frequency — for both protocols, Stratum V1 and V2. In-memory and additive: the share-validation logic itself is unchanged; it only labels the reject that was already counted.
  • Why it helps. The trigger was a concrete case: a NerdAxe (Sv2) showed “over 5% rejects” in its miner software. Measured, pool and miner counters were in exact lockstep (no discrepancy), and the rate was a decaying reconnect effect after box updates — no bug, no money impact. Telling exactly that apart — a benign reconnect blip vs. a real misconfiguration — is what the reason breakdown now makes obvious at a glance.

Also in this release: a faster multi-arch Docker image build (cross-compile instead of arm64 emulation) and a batch of dependency updates (bitcoin, mdns-sd, anyhow, sysinfo + UI).

Honest framing: this is a diagnostics/transparency feature, not a hashrate gain and not a correctness fix — payouts and share scoring are unchanged. It just makes operations more legible: a noisy miner is immediately attributable instead of guessed. 1039 tests green, svelte-check clean, reproducible build as always.

dvb-WarpPool v1.14.1 — no more false “low difficulty” rejects for small miners (V1 + V2)

A small but targeted patch — triggered by a real measurement on a NerdAxe over Stratum V2.

  • The problem. Pools continuously adapt per-miner difficulty (VarDiff). So that a share a miner computed against the slightly older, lower difficulty isn’t lost when the difficulty steps up, there’s a short “grace window” in which the previous target still counts. That window used to hold only one previous target. On small miners the share rate fluctuates a lot statistically (Poisson), and VarDiff then steps up several times in quick succession — a share against a two-steps-old target slipped through and was wrongly counted as a “low difficulty” reject.
  • New. The grace window now keeps a ring of the last eight targets. If an incoming share meets any of them (within the 60-second window), it’s accepted instead of rejected. Applies to both protocols, Stratum V1 and V2. Purely additive — with a single retarget everything behaves exactly as before.
  • Honest framing. This is not a hashrate gain and not a money matter: block chance is unchanged (found blocks are checked against the network difficulty, entirely separate from this pool-target window), and payouts are untouched. It’s a correctness/robustness improvement: small miners’ reject rate becomes honest again, and the operator isn’t chasing a phantom problem.

How did we find it? We actually measured the cause: a new opt-in diagnostic log (enabled only via RUST_LOG, zero overhead in normal operation) breaks down, per rejected share, how far it was below the current target and whether it would have met a recently valid target. That made it immediately clear these were retarget slip-throughs — not broken hashes.

1044 tests green (including new regression tests “share against a two-steps-old target is accepted” for V1 and V2), svelte-check clean, reproducible build as always.

dvb-WarpPool v1.15.0 — internal security audit (25 findings, all fixed) + a hardened block-submit path

This release is the result of a full internal security and correctness audit: 25 confirmed findings, all fixed — and then re-checked by a deliberately skeptical second review pass (which caught three more real touch-ups). The highlights, framed honestly:

  • The big one: the block-submit path. When a miner with version-rolling enabled (overt ASICBoost — practically every modern ASIC, plus NerdAxe/NerdQaxe) finds a block, the header used to be reassembled with the un-rolled version. Result: the submitted hash no longer matched the proof-of-work, Bitcoin Core would reject the block as high-hash, and the block reward would be lost. Now the block-found event carries the exact rolled version and reconstructs the block from the exact job it was mined on. For V1 and V2. Honest: this was a latent bug — a solo pool rarely finds a block, and there hasn’t been a mainnet block yet — so it was found proactively via the audit and fixed before it could ever bite. It changes nothing about hashrate or block chance; it makes sure a block you do find reliably reaches the chain.
  • New & user-facing: dismissable health warnings (GitHub #76**).** The “Bitcoin Core is pruned” notice (and any other node warning) used to come back on every reload. Now each warning in the banner has a “Hide permanently” button (when logged in as admin), and a new Admin → Health page lists what you’ve hidden so you can bring it back. Precise: hiding bitcoin_pruned silences only that notice — new/other warnings still show. Also seedable via config.toml.
  • Further hardening from the audit (operator-relevant): 2FA can no longer be reset without a valid code; a read-only API token can no longer read the node’s RPC password; the LAN miner scan now requires admin auth and stays within private IP ranges; transient RPC errors at block-submit time are now retried instead of being wrongly discarded as an auth error. Plus various smaller robustness fixes (atomic energy accounting, notification escaping, reconnect behavior).

All purely additive, no breaking changes. 1083 tests green (including new regression tests for the version-rolling fix, end-to-end and per protocol), svelte-check clean, reproducible build as always. No “battle-tested” claim, no mainnet block yet.

1 Like

dvb-WarpPool has moved: own forge, own registry — git.warppool.org

New here? dvb-WarpPool is an open-source self-hosted Bitcoin solo mining pool (Rust, full operator web UI/PWA in 8 languages, for NerdMiner alongside Bitaxe alongside Avalon Q). Stratum V1/V2/TLS, signed & reproducible builds, AGPL.

The short version: GitHub permanently suspended our account — the project lives on, now on its own infrastructure.

What happened, factually: GitHub’s abuse review classified the project’s CI usage as “incentivized activities / general computing” — the boilerplate applied to crypto-adjacent projects. For context: our CI only ever built and tested software (Rust builds, docs, signed releases). No mining ever ran in CI. The appeal was finally rejected; repos, issues, releases and Docker images went offline from one moment to the next. That’s GitHub’s prerogative on their platform — but it’s also exactly the risk this project has always preached about mining: if you build on someone else’s infrastructure, you can lose it.

So we did what we preach and self-hosted:

  • New home: git.warppool.org/dvb-projekt/dvb-WarpPool — a self-hosted Forgejo instance (open-source forge, EU server) with code, releases and its own Docker registry. No third-party host left that can switch the project off via a classifier.
  • Nothing was lost: the complete git history (all branches, all 50 release tags) moved 1:1. You can verify that yourself — git is content-addressed, the commit hashes are identical to before.
  • Docker images now come from git.warppool.org/dvb-projekt/dvb-warppool (multi-arch amd64+arm64, cosign-signed). The old ghcr.io paths are dead.
  • Umbrel users — one-time switch required: already-running pools keep running untouched. But the Community Store itself was fetched from GitHub — the old entry can no longer deliver updates or fresh installs. Re-add it once: App Store → three-dot menu → Community App Stores → remove the old dvb-projekt entry (github.com…) → add the new URL: https://git.warppool.org/dvb-projekt/dvb-projekt-Umbrel-Community-App-Store.git — everything works as before afterwards.
  • Homepage: warppool.org — overview, features and all downloads in one place.
  • Docs: docs.warppool.org
  • Bugs & feedback: file an issue at git.warppool.org/dvb-projekt/dvb-WarpPool/issues — registration is open, new accounts get a quick manual approval (spam protection for a small instance). No account wanted? Email dvbprojekt@gmx.de works too.

What does not change: the license (AGPL + commercial option), signed & reproducible builds (now with a project-held cosign key instead of the GitHub-bound keyless flow — the public key lives in the repo), the release cadence, and the code itself. Honest as always: the move cost us the GitHub metadata (old issues/PRs) and the pending PR for the official Umbrel store — we’ll rebuild both as needed. No “battle-tested” claim, no mainnet block yet — a server move doesn’t change that. :wink:

A Bitcoin project that takes self-sovereignty seriously should run its own forge. Now it does.

Homepage: warppool.org · Code: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge. · Docs: docs.warppool.org

dvb-WarpPool v1.16.0: block templates straight from Bitcoin Core — over its IPC interface

New in v1.16.0 — one for the plumbing enthusiasts:

The pool can now pull its block templates directly from Bitcoin Core via Core’s IPC mining interface. Until now (and still, by default) it goes the classic route: getblocktemplate over JSON-RPC plus a ZMQ notification when a new block arrives. That works well — but it’s a detour, and Core’s ZMQ queue can lag noticeably under load.

Bitcoin Core v31 ships a native IPC interface (Cap’n Proto) for exactly this. dvb-WarpPool now optionally speaks it directly instead of RPC+ZMQ. In our own benchmark the pool fetches a fresh template in ~5–12 ms that way versus ~90–100 ms over GBT+ZMQ (the gap is mostly the ZMQ queue lag). For a solo pool that means: after a new block on the network you switch to fresh work a touch sooner — i.e. slightly fewer wasted hashes on a stale template right after a block change. Not a hashrate boost, just cleaner plumbing.

Honest context:

  • Off by default. Existing setups keep using GBT unchanged — nothing to do. A clean, shared TemplateSource trait keeps both paths interchangeable.
  • Requires Bitcoin Core v31.0. Still on v30? You keep using GBT — perfectly fine.
  • Switching is explicit: Admin → Bitcoin Core has a live GBT ⇄ IPC toggle that probes the socket first and falls back to GBT automatically if it isn’t reachable — no shot in the dark.
  • Umbrel: the Bitcoin app has exposed the IPC socket since v1.3.0 (settings toggle “IPC Mining Interface”). The pool mounts Core’s data dir read-only to reach the socket — the store app brings that automatically. Don’t want the IPC exposure at all? Just leave the switch on GBT.

Everything else as usual: same license (AGPL + commercial option), signed & reproducible builds, 1098 tests gating every release in CI. No “battle-tested” claim, no mainnet block yet — still saying that out loud. :wink:

Full comparison against ckpool/public-pool/mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Code & releases: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.

dvb-WarpPool v1.16.1 + v1.16.2 — the IPC switch is now easy to find, and the Umbrel status is correct

New here? dvb-WarpPool is an open-source self-hosted Bitcoin solo mining pool (Rust, full operator web UI/PWA in 8 languages, Stratum V1/V2/TLS, signed & reproducible builds, AGPL). Since the move it runs entirely on its own infrastructure (git.warppool.org / docs.warppool.org).

Two small follow-ups to the optional IPC template backend introduced in v1.16.0 (block templates straight from Bitcoin Core over its IPC interface, Core v31):

v1.16.1 — the switch is now in the navigation. The Admin → Bitcoin Core page (with the GBT ⇄ IPC toggle and the bitcoin.conf editor) existed, but wasn’t linked in the admin navigation — you could only reach it by typing the URL. It now has a “Bitcoin Core” tab (in all 8 UI languages), one click away.

v1.16.2 — the stale “IPC is off” warning on Umbrel clears. If you enabled the IPC toggle after the fact, Umbrel sometimes kept showing “:warning: the Umbrel Bitcoin app reports: IPC mining interface is OFF” — even though IPC was live. Reason: Umbrel sets that variable at container start, so toggling later left the banner stale. It’s now gated on the actual socket test: the moment the test returns OK, the warning is gone. (On older builds, restarting the WarpPool app fixed it.)

Plus a docs-accuracy pass across the whole documentation (cleanly caught up after the move to our own forge).

None of this changes behaviour, protocol, or the API — the test suite is unchanged (1098). Honest as always: no “battle-tested”, no mainnet block yet. :wink:

Full comparison vs ckpool/public-pool/mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Code & releases: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.

dvb-WarpPool v1.16.3 — switch the language and literally EVERYTHING is translated now (8 languages)

New here? dvb-WarpPool is an open-source self-hosted Bitcoin solo mining pool (Rust, full operator web UI/PWA, Stratum V1/V2/TLS, signed & reproducible builds, AGPL). Your miners point at your own host instead of a public pool — find a block and the full reward goes straight to your Bitcoin address. It runs entirely on its own infrastructure (git.warppool.org / docs.warppool.org).

The interface has been available in 8 languages for a while — but three admin pages (API Tokens, Audit Log, Notifications) and the relative timestamps (“just now” / “5m ago”) stubbornly stayed German no matter which language you picked. If you run the pool in Spanish, French, Japanese, Chinese, etc., that was a jarring break.

v1.16.3 cleans that up completely:

  • The last German strings are translated. Those three pages, the relative times, various fallback texts, the device auto-scan labels and a handful of status/error messages now all route through the translation system — with real translations in all 8 languages (DE/EN/ES/FR/IT/JA/PT-BR/ZH). Switching language now means the entire interface follows (~130 new strings × 8 languages).
  • A CI guard keeps it that way. A new automated check fails the build if (a) the 8 language files don’t share the exact same set of strings, (b) a UI string is added without a translation, or (c) hardcoded German creeps back into the source. So this gap simply can’t return.
  • Both end-user manuals (Umbrel + general) were updated accordingly (the “this page is in German” notes are gone, since it’s English now) and given richer screenshots.

None of this changes behaviour, protocol, or the API — pure interface polish, test suite unchanged (1098). Honest as always: no “battle-tested”, no mainnet block yet. :wink:

Full comparison vs ckpool/public-pool/mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Code & releases: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.

dvb-WarpPool v1.17 — turn your solo setup into a public 0%-fee pool where every miner keeps their own coins

For newcomers: dvb-WarpPool is a self-hosted Bitcoin solo mining pool written in Rust. Your
node, your block, your reward — the payout flows to your wallet directly via the coinbase,
with no accounts, no custody, no operator in between. Built for lottery miners running a
NerdMiner next to a Bitaxe next to an Avalon Q on their own node.

New in v1.17: per-worker mode. One config switch —
[mining] payout_mode = "per_worker" — turns your private solo pool into a public pool you
can open to other miners without ever holding their coins:

  • Everyone mines to their own address. The BTC address is taken straight from the Stratum
    login (address.rig). Whoever finds the block gets the full reward in a single coinbase
    output — 0 % pool fee, non-custodial. An invalid or wrong-network address is rejected (no
    silent fallback to an operator address). The pool never holds funds.
  • The default single-address mode is unchanged — byte-for-byte. Nothing changes unless you
    deliberately turn per-worker on.
  • Shareable per-wallet dashboard at /users/<address>: hashrate windows (1m/5m/1h/1d/7d),
    best share, estimated time to next block, per-rig list. The JSON at the same path is
    ckpool-compatible (firmware / ckstats). (v1.17.1 + v1.17.2 polish this page: it now
    loads correctly on direct link / bookmark and its stats view is robust in every case.)
  • Optional ownership proof: a miner can verify their address with a signed message (BIP-137,
    no coins moved) to unlock — for themselves only — a privacy toggle (hide the address) and
    notifications (ntfy / webhook on block-found or a rig going offline). Default: public, no
    account.
  • Self-hostable & spreadable: per-worker works on Stratum V1 and V2; anyone can run their
    own instance on their own domain. AGPL-3.0.

Keeping it honest: tested and proven on regtest and signet against a real Bitcoin Core
(consensus E2E: per-worker block accepted, correct address attribution, no cross-pay) — a
mainnet block is still to come.

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs. ckpool / public-pool / mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Project page: https://warppool.org

dvb-WarpPool v1.18.0 — your public pool now shows only as much as you want

Quick intro for newcomers: dvb-WarpPool is a self-hosted Rust Bitcoin solo mining pool. With
payout_mode = "per_worker" it becomes a public, non-custodial 0%-fee pool where every miner
mines to their own address — full block reward, no fee, no custodian.

New in v1.18.0: control over what your pool exposes publicly. Until now the Workers page was a
fully browsable directory of every miner’s address plus its per-rig breakdown — more open than
what the established solo pools do. So there’s now a new [privacy] section with two toggles:

  • wallet_directory_public = false — the browsable wallet directory disappears for anonymous
    visitors (like solo.ckpool.org, which has no public directory at all). Every address keeps its
    shareable /users/<address> page — reachable by direct link, but nobody can enumerate all
    addresses anymore. The logged-in operator still sees everything.
  • leaderboard_addresses_public = false — the BTC address in the public best-shares
    leaderboard is masked server-side (bc1qsx…dvng), like AtlasPool. The operator sees full
    addresses.

Both toggles default to the previous open behaviour — existing installs don’t change on
upgrade. And they’re independent of the existing per-miner opt-out (a miner can verify their
address with a signed message and hide themselves) — one is operator-wide, the other is per-miner.

Small, but it closes a gap: running a public mainnet pool without handing strangers a ready-made
list of every miner’s address and rig setup. Payouts and block construction are untouched.

Honest is honest: proven on regtest and signet against real Bitcoin Core — a mainnet block
is still to come.

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs ckpool / public-pool / mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Project site: https://warppool.org

dvb-WarpPool v1.19.0 — donations for public 0% pools, and a wizard that sets the public mode up for you

Quick intro for newcomers: dvb-WarpPool is a self-hosted Rust Bitcoin solo mining pool. With
payout_mode = "per_worker" it becomes a public, non-custodial 0%-fee pool where every miner
mines to their own address — full block reward, no fee, no custodian.

That left a gap: a pool that takes 0% has no built-in funding. Running one publicly means paying
for hosting out of pocket. New in v1.19.0: voluntary donations — cleanly built into the UI, but only
when you’re a public pool.

  • Admin → Donations — a new admin page (shown in the menu only in per-worker mode) where you
    set an optional on-chain Bitcoin address and/or a Lightning address (LN address / LNURL /
    BOLT12). The on-chain value is validated on save; either field may be left blank.
  • “Support this pool” card — as soon as at least one address is set, a donation card appears at the
    bottom of the public dashboard with copy buttons and QR codes (the on-chain QR is a bitcoin:
    URI a wallet opens directly).

Important: the addresses are pure operator metadata — they’re never mixed into coinbase
construction. So the hard rule stays intact: a per-worker pool pays the finder the full reward; a
donation is something a visitor chooses to send to a displayed address. Stored as a pool setting (no
restart, no config.toml edit).

Plus a friendlier setup wizard. The Mining card now offers a “Private solo pool” ⟷ “Public 0%
pool”
choice. Pick public, and the wizard writes payout_mode = "per_worker" for you, hides the
(unused) pool-wide payout address, and forces the fee to 0 — no hand-editing of config.toml. In all
8 wizard languages.

Nothing changes for private solo pools: the donation menu and card never appear there.

Honest is honest: proven on regtest and signet against real Bitcoin Core — a mainnet block is
still to come.

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs ckpool / public-pool / mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Project site: https://warppool.org

dvb-WarpPool v1.19.1 + v1.20.0 — hardening after the first public mainnet run, and 2FA that can’t lock you out

Quick intro for newcomers: dvb-WarpPool is a self-hosted Rust Bitcoin solo mining pool. Privately
you mine to your own address; one switch turns it into a public, non-custodial 0%-fee pool where
every miner mines to their own address — full block reward, no fee, no custodian.

Since mid-July pool.warppool.org has been running publicly on mainnet with real miners. That
live run is exactly what drove two hardening releases — both summarised here.

v1.19.1 — the privacy hole the live run exposed. Three read endpoints ignored the [privacy]
toggles: they hid the nav tabs, but the data still sat one request away. Most importantly,
/api/workers served every miner’s full payout address to any visitor — even with the wallet
directory hidden.

  • Leaderboard / worker addresses are now masked server-side (bc1qtg…eqz0.bitaxe602) — the rig
    label is kept
    so you can still tell your own machines apart. The logged-in operator still sees
    everything in full.
  • /api/hardware (OS/kernel/CPU/RAM) and /api/miners (LAN devices) are now genuinely closed
    to anonymous visitors, not just hidden from the menu.
  • Stratum V2 miners show their hardware again. The pool synthesises an identity from the Sv2
    handshake but was dropping it on the Sv2 path — fixed.
  • New header badge “IPC / GBT” — tells you at a glance whether block templates come over Bitcoin
    Core’s IPC interface or polled RPC. (Core’s own IPC is still experimental — I deliberately don’t call
    it “proven”.)

v1.20.0 — 2FA that can’t lock you out. Until now, losing the phone with your authenticator meant
losing access to the admin area. Now, enabling 2FA hands you 10 one-time recovery codes (shown
once, then stored only as an Argon2 hash):

  • If you lose your authenticator, enter one of these codes instead of the app code at login — each
    works exactly once.
  • The 2FA page shows how many codes remain, warns when few are left, and can generate a fresh
    set
    with your current app code (the old ones then stop working).

Also fixed: address ownership verification could get stuck. One typo when signing the message (or
signing with the wrong wallet) used to consume the challenge — and every retry failed forever. Now a
failed attempt keeps the challenge; only a successful check consumes it. And the admin toggle that was
mislabelled “Miners tab” now correctly controls the “Devices” tab.

Honest is honest: the pool runs publicly on mainnet but has not found a block yet — the full
block path (per-worker coinbase → real Bitcoin Core accepts the block) is proven end-to-end on regtest
and signet; the mainnet proof is still outstanding. All open source (AGPL), 1164 CI-gated + signed,
reproducible builds.

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs ckpool / public-pool / mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Public pool + operator manual: dvb-WarpPool — Public 0% Solo Pool Operator Manual (free PDF)
Project site: https://warppool.org

pool.warppool.org is live — a public 0% solo pool that knows what a Bitaxe is

Quick intro: dvb-WarpPool is an open-source (AGPL) Rust Bitcoin solo pool. It now runs at
pool.warppool.org as a public, non-custodial 0% pool on mainnet: every miner mines to their
own address
, taken straight from the Stratum login. If your rig finds the block, the coinbase pays
you the full reward. No fee, no custodian, no account. (The daemon refuses to start if a fee
is configured in this mode.)

But other public solo pools do that too. The reason to try this one is different.

Your Bitaxe doesn’t start at difficulty 100,000 here.

Most public solo pools start every miner at a fixed difficulty of 100,000 — and don’t remember
it
. For a Bitaxe Gamma (~1.2 TH/s) that’s one share every six minutes. Your hashrate readout
is guesswork, the graph jitters, short sessions show nothing. And every time your wifi blips or the
pool restarts, it all starts over.

dvb-WarpPool reads your miner’s user agent and starts it in the right league — and the difficulty
survives reconnects and pool restarts (persisted per worker). Instead of EMA jitter there’s a
Poisson significance gate: it only retargets when the share rate genuinely clears a confidence band,
not on every outlier. And a worker that goes quiet because its difficulty ended up too high gets
walked back down by a guarded idle decay instead of being stranded.

Not a paper figure — this is pool.warppool.org right now: a Bitaxe Gamma (~1.2 TH/s) running here
lands a share every ~30 seconds thanks to VarDiff. At a fixed 100,000 that exact same hardware
would wait six minutes for a single one. And the extreme case shows how absurd a fixed 100,000
is: a KH/s-class NerdMiner V2 would, by the math, get one share every ~59 years at 100,000 —
here it checks in every couple of minutes.

What else is different:

  • Stratum V2 and TLS — your Bitaxe/NerdQaxe speaks V2; most pools don’t offer it. Here
    :3333 (V1), :3334 (V1 over TLS) and :3336 (Sv2) are all listening.
  • Templates ~90 ms sooner. Block templates come straight over Bitcoin Core’s IPC interface
    (Cap’n Proto, Core ≥ 31) instead of polled RPC — measured ~5–12 ms vs ~89–101 ms. For you: after
    every network block you get fresh work sooner and spend less time hashing on a block that’s
    already gone. (Core’s own IPC is still marked experimental — it runs here, but I won’t call it
    proven.)
  • Your address isn’t in a browsable list. The wallet directory is off and leaderboard addresses
    are masked. Your page at /users/<your-address> stays reachable by direct link — and serves
    ckpool-compatible JSON, so your firmware and ckstats keep working. If you want more, verify
    your address with a signed message to unlock block-found and rig-offline alerts — no account.

Connecting:

stratum+tcp://pool.warppool.org:3333      (V1)
stratum+tcp://pool.warppool.org:3334      (V1 over TLS)
                pool.warppool.org:3336    (Stratum V2)

User: <your-bitcoin-address>.<rig-name>
Pass: anything

An invalid address is rejected outright. There’s no fallback that could silently pay someone else.

The honest part: the project is young. This pool has not found a mainnet block yet
established pools like solo.ckpool.org have a track record, I don’t. Solo mining is a lottery anyway;
this pool makes buying the ticket nicer, not the odds better. The full block path is proven against
real Bitcoin Core on regtest and signet (correct per-worker coinbase and witness commitment
included) — the mainnet proof is still outstanding. If that’s not for you, ckpool is a fine choice;
my own comparison page says so.

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs ckpool / public-pool / mkpool (source-verified): Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Pool: https://pool.warppool.org

https://www.facebook.com/100001354454108/videos/3246396338894836/

dvb-WarpPool v1.20.1 — the fix that came from the Bitaxe group: Sv2 miners get their own difficulty back*

Quick intro for newcomers: dvb-WarpPool is a self-hosted Rust Bitcoin solo mining pool. Privately you
mine to your own address; one switch turns it into a public, non-custodial 0%-fee pool where every
miner mines to their own address — full block reward, no fee, no custodian.

This release is small and came straight out of real operation: a miner reported that his Bitaxes on
Stratum V2 were all stuck on the same frozen difficulty
— while the same machines on Stratum V1 spread
out normally, and his Qaxe++ weren’t affected at all. That exact combination is what pinned the bug down.

Why it happened. Stratum V2 has two channel types: Standard channels (which a Bitaxe opens) and
Extended channels (which e.g. NerdQAxe opens). Adaptive difficulty (VarDiff) was only wired into the
Extended path. A Standard channel got its difficulty once, derived from the hashrate the miner
advertises, and never adjusted again. Identical Bitaxes advertise the same hashrate, so they all landed
on the same value — and it never moved, leaving them frozen together. On V1 each miner adjusts
independently on its own (noisy) share stream, which is why V1 looked fine.

What v1.20.1 does. Standard channels now seed the same VarDiff as Extended — including the
miner-class tuning (a Bitaxe targets a shorter share cadence, for instance) and restoring the settled
difficulty after a reconnect. Every Sv2 miner adapts on its own share stream again, exactly like on V1.

Thanks to John11 for the genuinely good bug report: “V1 fine, only the Bitaxes affected, Qaxe++ not”
was the clue that isolated the cause immediately.

Honest is honest: the pool runs publicly on mainnet but has not found a block yet — the full
block path (per-worker coinbase → real Bitcoin Core accepts the block) is proven end-to-end on regtest
and signet; the mainnet proof is still outstanding. All open source (AGPL), 1166 CI-gated + signed,
reproducible builds.

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs ckpool / public-pool / mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Public pool + operator manual: dvb-WarpPool — Public 0% Solo Pool Operator Manual (free PDF)
Project site: https://warppool.org

dvb-WarpPool — why updating a self-hosted solo pool doesn’t hurt

Quick intro for newcomers: dvb-WarpPool is a self-hosted Rust Bitcoin solo mining pool. Privately you
mine to your own address; one switch turns it into a public, non-custodial 0%-fee pool where every
miner mines to their own address — full reward, no fee, no custodian.

This week I rolled a fix out to the public mainnet pool and actually timed how long it was gone. Result:
under one second during which the pool wasn’t accepting stratum connections. I’m not posting that as
a shop-window number — I’m posting it because it shows what operating this thing feels like, and why it’s
no accident given the design:

  • The new image is pulled while the old pool keeps serving. There’s no window where something is
    “building/loading” and nothing is running — the swap only happens once the image is ready.
  • The swap itself is a fraction of a second. The Rust daemon cold-starts and binds every listener
    (Stratum V1, V1-TLS, V2) in roughly 300 ms. No JIT warmup, no 30-second boot.
  • There’s nothing to reconcile. Because every miner mines solo to their own address, the pool keeps
    no balance ledger that a restart would have to hold consistent. At most a few in-flight shares are lost
    — the same consequence as a brief network blip.
  • Only the pool restarts, not the node. Bitcoin Core and the TLS proxy stay up — no chainstate
    interruption, no re-sync, no certificate reload.

Framed honestly: this is a fast restart, not “zero downtime”. The TCP connections drop, and each
miner reconnects on its own timer — a few seconds depending on firmware. “Pool unreachable” was under
1 s; “miner back on” is single-digit seconds per device. My ~6 live miners saw only a brief reconnect.

Behind that is the rest of the operations story I care about: reproducible, signed builds (you can
rebuild and confirm the published binary comes from exactly this source), a built-in auto-updater for
the desktop app, and a one-container deploy for server/Umbrel that leaves the node alone. Self-hosting
shouldn’t feel like a second job.

Honest is honest: the pool runs publicly on mainnet but has not found a block yet — the full
block path (per-worker coinbase → real Bitcoin Core accepts the block) is proven end-to-end on regtest
and signet. All open source (AGPL).

Source: dvb-projekt/dvb-WarpPool: Bitcoin solo/pool mining server — Stratum V1 + V2 - Forgejo: Beyond coding. We forge.
Comparison vs ckpool / public-pool / mkpool: Comparison (ckpool / public-pool / mkpool) - dvb-WarpPool
Public pool + operator manual: dvb-WarpPool — Public 0% Solo Pool Operator Manual (free PDF)
Project site: https://warppool.org

Closer to home: WarpPool now runs from Germany :germany:

We’ve moved our Bitcoin solo pool from Helsinki to a datacenter in Nuremberg — right into the DE/EU community that actually uses it.

And the difference is measurable. From an ordinary German home line:

  • Ping: ~32 ms → ~16 ms
  • Stratum handshake: ~65 ms → ~37 ms

Roughly halved.

To be straight with you: latency isn’t an efficiency factor in solo mining — it only really matters at the moment a new block lands. We did it anyway. A quick response time is a good sign of a healthy pool, and we’d rather sit close to the people we’re building this for.

Best part: you don’t have to take our word for it. Measure it yourself — with an independent open-source tool:

python3 stratum_test.py pool.warppool.org 3333 --runs 3

-> GitHub - mweinberg/stratum-speed-test: A simple script to test latency, stratum handshake speed, and TLS+stratum connection speed to Bitcoin mining pool stratum servers. · GitHub

WarpPool stays what it is: a from-scratch Rust solo pool, non-custodial, 0 % fee — now just a little closer to you. :high_voltage:

Tell your miners something — without the detour through Discord

Briefly, for anyone new: dvb-WarpPool is a from-scratch Rust Bitcoin solo pool you host
yourself. Privately you mine to your own address; one switch turns it into a public, non-custodial
0%-fee pool
where every miner mines to their own address — full reward, no fee, nothing held.

If you run one publicly, you know the problem: you want to resync the node on Sunday and really should
tell your miners first. Not everyone reads Discord, and until now there was no way to put anything on
the pool page itself.

v1.21.0 turns that into a twenty-second job. Under Admin → Banner you type your notice, pick how
long it should run (minutes, hours or days) and hit Start. The text scrolls along the top of the pool
page for every visitor, and disappears by itself when the time is up. A Stop button ends it early.

A few details that matter in day-to-day operation:

  • It expires, you don’t have to remember. The expiry is stored, so there’s no scheduler and no
    mental note — and a forgotten maintenance banner doesn’t hang around for weeks. A pool restart
    doesn’t change it either.
  • Readable even when it’s long. Pointing at it, or reaching it with the keyboard, pauses the
    scrolling. Visitors who ask for reduced motion get the text static instead of moving.
  • Plain text, never HTML. What you type is shown literally — the input box isn’t an invitation for
    markup on your public page.
  • Gone on time. The page hides it at the exact expiry moment rather than waiting for the next
    refresh cycle.

Honest as always: the pool runs publicly on mainnet but has not found a block yet — the block path
is proven end-to-end on regtest and signet against a real Bitcoin Core. The project is young; ckpool has
been running since 2014.

As of v1.21.0: 1170 Rust tests gating every release in CI, signed and reproducible builds, Stratum
V1 + V2, TLS for miners, an operator PWA in 8 languages.

What an independent speed test says about WarpPool — and the one latency that actually matters

There’s a small open-source tool solo miners use to measure their pool’s response time: mweinberg’s Stratum speed-test. We ran WarpPool through it, against 20 other well-known solo pools, from an ordinary German home line.

The result, honestly: WarpPool lands in the top group (~18 ms ping, ~37 ms handshake), in the same tight band as the leading German pools. Solid. But here’s the framing that matters more to us than the ranking:

This miner-to-pool ping barely matters in solo mining. It only really counts at one moment — the block change. And that’s exactly where we put the work: not into the ping these tests measure, but into the latency that actually does something.

The block change, tightened. The instant a new block appears on the network, the pool has to build a fresh template and push new work to miners — the faster it does, the less time you waste on the old block. WarpPool can pull its template straight from Bitcoin Core’s (experimental) IPC interface. Roughly the pool-controlled path from block to fresh work at the miner (rounded, same location assumed):

  • WarpPool (IPC): ~10 ms to fetch the template + ~8 ms to deliver ≈ ~20 ms
  • The classic way (GBT+ZMQ): ~95 ms to fetch + ~8 ms to deliver ≈ ~105 ms

The entire lead (~80 ms) sits in the template step — the miner ping is the same for both and can’t close it. It’s opt-in and needs Core 31, and none of the usual self-hosted solo pools offer it at all. Honestly framed: in absolute terms that’s milliseconds every ten minutes — measurable, but no earnings miracle.

And more honestly still: the template step is only one part. How fast a pool reacts to a block change overall depends mostly on how quickly its node hears about the new block — a question of network connectivity, where large, widely-peered nodes lead. IPC is the part we do cleanly, not a claim to react first.

And what actually makes a solo pool good, no ping can measure:

  • 0 % fee, non-custodial — you mine to your own address, full reward, nothing held.
  • Built for small miners — sub-1 difficulty from the very first share (NerdMiner class), and difficulty that survives even a pool restart.
  • Reproducible, not just claimed — signed, reproducible releases; you can verify the binary came from exactly this source.

You can check both yourself — the ping with the tool, the builds with our signatures:

python3 stratum_test.py pool.warppool.org 3333 --runs 3

-> GitHub - mweinberg/stratum-speed-test: A simple script to test latency, stratum handshake speed, and TLS+stratum connection speed to Bitcoin mining pool stratum servers. · GitHub

Honest stays honest: the pool runs publicly on mainnet but has not found a block yet — the project is young. WarpPool is a from-scratch Rust solo pool, non-custodial, 0 % fee, self-hostable. :high_voltage: