• v1.34.0 9b3c13f682

    v1.34.0
    All checks were successful
    Release / Docker Multi-Arch (push) Successful in 22m31s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 11m22s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m6s
    CI / Rust clippy (push) Successful in 1m48s
    CI / Rust fmt (push) Successful in 1m12s
    CI / Rust test (push) Successful in 5m48s
    CI / UI (SvelteKit) (push) Successful in 1m15s
    CI / Security Audit (push) Successful in 1m21s
    docs / build (push) Successful in 37s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m0s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m51s
    Release / Linux AppImage (aarch64) (push) Successful in 28s
    Release / Linux AppImage (x86_64) (push) Successful in 27s
    Release / Cosign sign artifacts (push) Successful in 25s
    Release / Forgejo Release (push) Successful in 37s
    Stable

    dvb-projekt released this 2026-09-27 12:10:44 +00:00 | 209 commits to main since this release

    Fixed

    • dvb-WarpTune energy mode: without the pool's energy feed a miner holds
      Eco, not Balanced — at a service start until the first reading, and
      when the feed goes stale. Without a reading the tariff may be the
      grid's; Balanced has no Eco cap, and after a start on 2026-09-27 an
      Avalon Q stepped up to Standard (~1370 W) in the three minutes before
      the feed arrived. The provisional start while surplus entry is being
      debounced is Eco as well.
    • dvb-WarpTune: a device that says its chips are off is held, not judged.
      The WarpAxe firmware can switch the chips off from its UI and reports it
      (shutdown, chainStopped, chainPhase other than READY); the zero
      draw and 0 mV core output looked exactly like a dead chip, which marks
      the step and everything above it for an hour and steps down. While any
      of these signals, overheat mode, a fault flag or a mining pause is set,
      nothing is marked or written, and once the device hashes again the
      point is judged from scratch. A chain in FAILED is not a stop on
      purpose and stays with the dead-chip guard, whose restart recovers it.
    • dvb-WarpTune on the Avalon Q: a work-mode switch is written as
      ascset|0,workmode,set,<n>. The MM firmware takes a verb after
      workmode (get reads, set writes) and refused the bare
      0,workmode,<n> with "workmode unknown argument", so no live switch
      had ever reached the device. Found on the first live write, 2026-09-26.
    • Stratum V1 and Sv2: a share on a job from before a block change is
      checked and booked for 60 s instead of being rejected as stale. A miner
      finishes the work it holds when the new block's notify arrives and hands
      in the results a few seconds later; that is real work, and dropping it
      showed up as a steady 1–3 % stale rate (a Bitaxe Gamma: one or two shares
      per block change, 2.7 % over 16 h). A block solution on such a job still
      goes to the node, which decides between the two blocks. After 60 s the
      job is stale as before. V1's duplicate check no longer resets on a block
      change, so a share handed in before and after the change still counts
      once (the set stays capped).
    • dvb-WarpTune voltage trial: the share vote now reaches back far enough
      to hold the 200 shares a verdict needs. VarDiff keeps every miner near
      four shares a minute, so the 30-minute window topped out around 130 and
      a voltage between 85 and 95 % of the expected rate waited for good (a
      NerdAxe Gaia at 420 MHz / 960 mV, 2026-09-26). The window is 30 minutes
      or 200 shares, whichever reaches further back.
    • dvb-WarpTune voltage trial: the pool's accepted shares decide a voltage
      verdict, not the firmware's hashrate reading. NerdOS does not see an
      undervolted chip: a NerdAxe Gaia read 103 % at 420 MHz / 940 mV and the
      trial walked on to 930 while the pool booked 70 % of the expected rate
      over 1739 shares (2026-09-25); the old rule called a point good when
      either vote said so. Where shares are counted, a voltage is good on 200
      shares at ≥ 95 %, short of good on 200 below it or on 40 when clearly
      short (under 85 %), and the point waits until the shares are in. A miner
      without a share counter is judged on the reading alone, as before.
    • dvb-WarpTune voltage trial: only failures at rising voltages count
      towards "more voltage does not help this frequency". A floor probed
      again is a floor: 930 mV failing three times at 420 MHz marked the
      frequency unstable although 940 and 960 hashed, and the miner spent the
      evening at 400 MHz. A good verdict resets the count.

    Added

    • dvb-WarpTune: dvb-warppool-tune yield --host <miner>, the yield table.
      For every ladder point the miner visited in the last week it lists the
      minutes, the pool's accepted shares and their difficulty (turned into a
      share-derived TH/s with its 1/√shares error), the firmware's expected
      hashrate, the mean draw from the heartbeats and the J/TH — over every
      visit, settle minutes skipped, windows before a device change or a
      start with another chip discarded. Below the table the point each mode
      should run: Max the most hashes, Eco the fewest J/TH, Standard the most
      hashes within 5 % of Eco's efficiency; a point needs --min-shares
      (200) to be picked, and Max says when the runner-up is within the
      error. The regulator's ten-minute judge is a safety net, not a way to
      tell 700 MHz at 1210 mV from 700 MHz at 1160 mV; the first run on the
      Octaxe did (26 665 shares: 11.62 TH/s at 1210, 102 % of expected).
      --json for scripts.

    dvb-WarpPool v1.34.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.34.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.33.0 a4830f5381

    v1.33.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m59s
    CI / Rust fmt (push) Successful in 1m16s
    CI / Rust test (push) Successful in 6m22s
    CI / UI (SvelteKit) (push) Successful in 1m19s
    CI / Security Audit (push) Successful in 1m19s
    docs / build (push) Successful in 35s
    Release / Docker Multi-Arch (push) Successful in 23m13s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 11m47s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m31s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m3s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m51s
    Release / Linux AppImage (aarch64) (push) Successful in 26s
    Release / Linux AppImage (x86_64) (push) Successful in 27s
    Release / Cosign sign artifacts (push) Successful in 25s
    Release / Forgejo Release (push) Successful in 38s
    Stable

    dvb-projekt released this 2026-09-24 05:46:46 +00:00 | 219 commits to main since this release

    Added

    • dvb-WarpTune energy mode: surplus_enter_polls (readings with surplus
      before the surplus mode is taken, default 1) next to the existing
      surplus_exit_polls, both now per miner overridable. An Avalon Q on
      the defaults would have spent half of its Super minutes on the grid on
      a cloudy day (simulated on 2026-09-21/22); three polls in and two out
      keep it on the real surplus.
    • dvb-WarpTune: a step never seen hashing in full is judged (ten minutes,
      hashrate ≥ 95 %) before the next one is taken; the stock point, steps
      with a good voltage in the trial memory and steps judged this session
      are known and climb on the dwell as before. The first ascent on a new
      board takes ten minutes per step instead of ninety seconds (a NerdAxe
      Gaia reached 440 MHz in ten minutes and lost its core voltage there).
    • dvb-WarpTune: power collapse guard, the emergency stop that works inside
      the settle and judge windows. Every decision tick — before the settle
      gate, not after it — the regulator holds the draw against what the
      current point should pull (what it predicted for its own write, else the
      previous point's reading scaled by f·V²). Under 30 % of that, and only
      when the expectation itself is above 5 W, it steps back urgently to the
      last point that demonstrably ran and marks the collapsed step unstable.
      The NerdAxe Gaia of 2026-09-22 is the case: 30 s after 420→440 MHz the
      board fell from ~36 W to 4.99 W with shutdown: false, no fault flag and
      its unchanged nominal hashrate in the API — power was the only honest
      reading — and the regulator stood in settling 45s, judged after 600s
      for six minutes until the operator wrote the old point by hand. The
      Avalon Q is covered by the same path: its work modes run through this
      regulator, and it reports neither a VR output voltage nor a trustworthy
      momentary hashrate, so the dead-chip guard alone is half blind there —
      but because a mode switch re-initialises its hash board, the Q gives the
      board five minutes (power_collapse_hold_s) before a low draw counts,
      where the Bitaxes act on the first reading.
    • dvb-WarpTune: dead-chip guard. When the VR output reads 0 mV against a
      set point, or the momentary hashrate is 0, for three decisions in a row
      on a settled point, the step is marked unstable, the stock point is
      written and the board is rebooted (POST /api/system/restart, journal
      restart). A NerdAxe Gaia at 440 MHz / 970 mV had dropped its core
      voltage and sat at 5 W with no fault flag while the ten-minute judge
      waited (2026-09-22).
    • NerdAxe Gaia (BM1373, one chip, 6860 small cores, NerdOS) as a miner
      vendor: registration, LAN discovery by hostname, dashboard label and
      docs. The AxeOS probe now takes the board name from the firmware's
      deviceModel (NerdOS), so a board registered under a sibling label (a
      Gaia on a former Gamma address) shows up as what it is. dvb-WarpTune
      regulates it from the device's own option list (300–440 MHz, 900–1040
      mV), no vendor table needed.
    • dvb-WarpTune: eco_cap_mhz per miner — Eco mode's own ladder top. The
      miner steps down to it in Eco and never above it; the other modes ignore
      it. Until now Eco only left steps whose efficiency measured worse, which
      from a factory point never leads down.
    • dvb-WarpTune: voltage trial (voltage_trial, voltage_min_mv,
      voltage_max_mv per miner). At the frequency it holds the regulator
      writes the core voltage 10 mV lower once the point is judged healthy, and
      10 mV higher when a step turns unstable before it gives the frequency
      up, inside the configured window. Good voltages per frequency are
      journaled (kind = "trial") and read back at start; a failed voltage is
      the floor for that frequency for an hour, doubling per failure. Every
      trial is an ordinary verified write under the hourly breaker.
    • dvb-WarpTune: the fan and the power budget. While an automatic fan runs
      below 90 % the thermal budget is left to the fan and only the power cap
      limits a step up; the ten-minute judge decides on the new step. The
      fixed-fan thermal rule kept an Octaxe at 650 MHz through a whole
      afternoon of surplus with its fan at 61 %. Manual fans and fans at 90 %
      or above keep the old rule; the temperature guards are unchanged.

    Fixed

    • dvb-WarpTune energy mode: the surplus margin (surplus_min_excess_w)
      is an entry condition only. Once a miner runs its surplus mode its
      extra draw sits in the consumption the excess is computed from, so
      checking the margin again on the way out made a live Avalon Q leave
      Super as soon as it was in it (1244 W of surplus minus its own 850 W
      reads "below the 900 W margin"). In the surplus mode the pool's own
      flag decides whether to stay.
    • dvb-WarpTune: the urgent hashrate step-down (reading under 90 % of
      expected) now takes the pool's share counter on the settled point as a
      second vote, as the voltage verdicts already did, and the share window
      starts after the settle time. The Avalon Q judges a mode 900 s after
      its settle time, not after the switch, so the MM's 15-minute window no
      longer contains the hash-board re-init. Found with the WarpAxe
      simulator: a healthy Super mode read 86 % at the judge and cascaded
      Super → Standard → Eco without a fault.
    • dvb-WarpTune kept its regulator state per host address, not per device.
      The journal's unstable steps and voltage trials were replayed at start
      for whatever answered on that IP, so a replaced board inherited limits
      measured on its predecessor's silicon. A NerdAxe Gaia that took over a
      Gamma's address on 2026-09-22 carried the Gamma's 640 MHz / 1140 mV
      trial entry — a point outside the Gaia's 300–440 MHz, 900–1040 mV
      window. The board now identifies itself (macAddr, the Avalon MM's
      DNA, else a model fingerprint) and the identity is journaled with
      each start; a different one on a known address writes a
      device_changed line, and everything the journal remembers for that
      address before it is ignored from then on. Only identities of the same
      kind are compared, so a reply that drops the MAC is a telemetry gap,
      not a swap. A swap noticed while
      regulating stops that miner's loop instead of writing a ladder built
      for the previous board, and leaves the point where it is.
    • Hashrate accounting after a VarDiff retarget (Stratum V1 and Sv2). A share
      was booked at the worker's difficulty at the moment it arrived, but a V1
      miner keeps the old difficulty until the next job, and Sv2 shares in
      flight met the old target: after each retarget those shares counted at
      the new, up to fourfold difficulty. A six-minute link outage on
      2026-09-22 (idle decay, reconnect burst, retargets) drew a 65 TH/s peak
      into a 17 TH/s pool. V1 now books a share at the difficulty in force when
      its job went out; Sv2 books a grace-window share at the target it met.
      Acceptance is unchanged.
    • dvb-WarpTune voltage trial: the firmware's hashrate reading drifts by
      ±5 % on a steady point (NerdOS), which produced false "short of good"
      verdicts and pushed the voltage back up. The accepted-share counter is
      now the second vote (share difficulty from the pool row or the firmware's
      poolDifficulty): good when either says ≥ 95 %, short of good only when
      both do. A frequency that two upward trials in a row did not improve is
      marked unstable and left on the third failure instead of trialled up to
      the top of the window. An unstable step is skipped on the way up when
      the one above it is usable (the budget judges the jump), and a step down
      lands below it. Each share counts at the difficulty it was found at (VarDiff
      moves mid-window), the vote looks up to 30 minutes back on one point,
      and a short reading waits while fewer than 40 shares are in. A verdict
      also waits until the reading has settled.
    • dvb-WarpTune energy mode: surplus_exit_polls counted telemetry ticks
      (every 5 s) instead of pool feed readings (every poll_secs), so ten
      "polls" passed in fifty seconds and one cloud ended every surplus
      window. Only a new feed reading counts now; a stale feed still falls
      back to Balanced after the hold.
    • dvb-WarpTune energy mode: while the pool's surplus flag is on but the
      surplus is below a miner's surplus_min_excess_w, the governor now holds
      Eco. It fell through to the tariff rule, read the pool's 0 EUR/kWh surplus
      rate as a cheap tariff and picked Balanced, which on an Avalon Q opens the
      ladder up to Super on 200 W of surplus (seen on the dry run 2026-09-20).

    dvb-WarpPool v1.33.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.33.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.32.0 f8e753ed35

    v1.32.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m50s
    CI / Rust fmt (push) Successful in 1m14s
    CI / Rust test (push) Successful in 6m3s
    CI / UI (SvelteKit) (push) Successful in 1m17s
    CI / Security Audit (push) Successful in 1m20s
    docs / build (push) Successful in 36s
    Release / Docker Multi-Arch (push) Successful in 22m58s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 12m12s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m34s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m6s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m55s
    Release / Linux AppImage (aarch64) (push) Successful in 27s
    Release / Linux AppImage (x86_64) (push) Successful in 27s
    Release / Cosign sign artifacts (push) Successful in 29s
    Release / Forgejo Release (push) Successful in 38s
    Stable

    dvb-projekt released this 2026-09-19 18:05:42 +00:00 | 245 commits to main since this release

    Added

    • dvb-WarpTune energy mode: surplus_min_excess_w (global, or per miner)
      — the PV surplus the pool must report before the surplus mode is taken,
      roughly the extra power that mode draws over Eco — and
      surplus_exit_polls (default 3), the consecutive readings without
      surplus needed before the surplus mode is left. The pool's own surplus
      flag flips on the first watt of excess; on the first dry run that made
      the governor see-saw Max/Eco every hold period, and live it would have
      sent an Avalon Q into Super (+850 W) for 581 W of surplus.

    Changed

    • Solar surplus ([mining.electricity.solar]): new
      consumption_includes_pool (default true). A house smart meter reports
      the whole house load, miners included, so the surplus flag now needs
      pv − consumption ≥ surplus_buffer_w instead of
      ≥ pool_power + surplus_buffer_w, which counted the miners twice: on a
      1.5 kW house with 1.05 kW of miners the flag stayed off until PV was
      1.25 kW above the load, i.e. until it covered the miners a second time.
      Measured 2026-09-19: the miners ran fully on PV for about four hours,
      the flag was on for six minutes. Set the option to false for a
      sub-meter that does not see the miners; that keeps the old rule. The
      admin API reads and writes the field; the energy card's rate source
      and the WarpTune energy governor follow the same decision.

    Fixed

    • dvb-WarpTune energy mode: the "pool energy feed unavailable, holding
      Balanced" fallback at service start no longer starts the mode-hold
      timer, so the first real tariff reading (a minute later) switches the
      miner at once instead of after the full min_mode_hold_secs. A hold
      still applies between two real decisions and when the feed drops out.

    dvb-WarpPool v1.32.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.32.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.31.0 8d079a2766

    v1.31.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m51s
    CI / Rust fmt (push) Successful in 1m16s
    CI / Rust test (push) Successful in 6m13s
    CI / UI (SvelteKit) (push) Successful in 1m16s
    CI / Security Audit (push) Successful in 1m21s
    docs / build (push) Successful in 36s
    Release / Docker Multi-Arch (push) Successful in 23m39s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 11m45s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m12s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m7s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m56s
    Release / Linux AppImage (aarch64) (push) Successful in 27s
    Release / Linux AppImage (x86_64) (push) Successful in 26s
    Release / Cosign sign artifacts (push) Successful in 28s
    Release / Forgejo Release (push) Successful in 36s
    Stable

    dvb-projekt released this 2026-09-16 11:55:46 +00:00 | 249 commits to main since this release

    The dvb-WarpTune items marked ¹ were already part of the 1.30.1 build (that
    patch release documented only its security fix); this is their first
    changelog entry.

    Security

    • Dependencies: rustls 0.23.41 → 0.23.45 (RUSTSEC-2026-0285: TLS 1.3
      handshake messages were accepted across encryption-level boundaries; the
      transcript stayed authenticated, so no handshake could be forged) together
      with rustls-webpki 0.103.15 and aws-lc-rs 1.18.1 / aws-lc-sys 0.45.0;
      chacha20 0.10.0 → 0.10.2 (0.10.0 was yanked).

    Added

    • dvb-WarpTune: Avalon Q ¹ (kind = "avalon"). Telemetry over the
      cgminer API (estats / summary / pools): chip average and maximum
      temperature, the MM's fan target, the mode's power cap, headline watts,
      hashrate, shares and stratum user, presented as an AxeOS-style device
      whose operating point is the reported work mode. The ladder is the three
      work modes Eco / Standard / Super and the only write is ascset workmode;
      failsafe 100 °C, write verification 60 s, settle 180 s, judged on the
      15-minute hashrate. dvb-warppool-tune probe <host> --kind avalon shows
      mode, temperatures, power and the mode table.
    • dvb-WarpTune ships in every release format ¹: .deb/.rpm (usr/bin),
      AppImage, the Docker image (/usr/local/bin) and the macOS tarball and
      .app (Contents/Resources/). v1.28.0–v1.30.0 carried it as source only.
      Nothing starts it by itself; scripts/setup-warptune.sh --binary <path>
      installs it from a release tarball without a Rust toolchain.
    • dvb-WarpTune: any ASIC model works when the device publishes its own
      option list (NerdOS /api/system/asic): the ladder is built from the
      device's frequencies and default point, and the expected hashrate uses
      the firmware's reported smallCoreCount instead of a table on our side
      (the BM1370 factor stays as the fallback for older firmwares). First
      target: the BM1373 boards NerdOS v1.1.0 supports. The vendor table is
      still BM1370-only, so ESP-Miner boards with other chips keep their
      "unsupported ASIC" message, now naming the missing option list.

    Changed

    • dvb-WarpTune: a point changed outside the regulator ¹ — an Avalon
      work-mode switch, a frequency edit in the AxeOS web UI — now restarts the
      settle and judge windows like the regulator's own writes do, is journaled
      at once and clears the proposal memory. Before, the hashrate-vs-expected
      guard compared the new point against the old point's averaged hashrate;
      four minutes after a manual Standard → Super switch the dry run booked
      "87 % of expected (urgent)" and live control would have taken every
      manual change straight back. A freshly started regulator also waits one
      judge window before its first hashrate verdict.
    • scripts/setup-warptune.sh ¹ signs the binary ad hoc with the fixed
      identifier com.dvb.warptune (macOS keys its Local Network grant on the
      code identity; a rebuild used to leave the agent with "No route to host"
      for every miner until re-allowed) and probes each miner with its
      configured kind, so an Avalon no longer shows as "not reachable".
    • dvb-WarpTune: a target_temp_c below the firmware's own fan target + 2 °C
      is now clamped to that floor (in every mode, Eco's extra margin included)
      instead of only warned about. Below it the fan PID holds the chip at its
      own target by slowing the fan while the regulator throttles, so the chip
      never cools and the regulator walks the whole ladder down; a live Gamma
      with fan target 60 °C against a 58 °C config went 640 → 500 MHz at a
      constant 60 °C before the test was stopped. The floor never exceeds the
      overheat clamp (overheat − 3 °C); when the fan target leaves less room
      than that, a note asks for a lower fan target on the device.

    Fixed

    • Build: proc macros and build scripts are no longer stripped in the release
      profile ([profile.release.build-override] strip = false). macOS 27's
      dyld refuses a stripped proc-macro dylib ("mis-aligned LINKEDIT string
      pool", seen on sqlx-macros), which broke every release build on a
      Mac after the OS update. Shipped binaries stay stripped; the Linux
      reproducible build is unaffected.
    • Admin → Health node card and /api/health: network.headers and the
      initial-block-download flag ¹ were read once at daemon start and never
      again — after two days both reference pools showed the header count 270
      blocks behind the height while the nodes were at the tip. The 30-second
      node poll now refreshes both.
    • dvb-WarpTune (Avalon) ¹: the hashrate guard judged steps on cgminer's
      since-boot average, which lags for hours after a mode switch (twelve hours
      of Super followed by Eco still read 89 TH/s; an Eco → Super step would have
      shown 59 % of expected and been taken back). Steps are judged on the
      15-minute window now; the since-boot figure is only shown by probe.

    dvb-WarpPool v1.31.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.31.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.30.1 fbc8e7ab69

    v1.30.1
    Some checks failed
    CI / Rust clippy (push) Successful in 1m54s
    CI / Rust fmt (push) Successful in 1m14s
    CI / Rust test (push) Successful in 6m12s
    CI / UI (SvelteKit) (push) Successful in 1m21s
    CI / Security Audit (push) Failing after 1m22s
    docs / build (push) Successful in 41s
    Release / Docker Multi-Arch (push) Successful in 24m5s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 12m41s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 11m39s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m8s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 2m3s
    Release / Linux AppImage (aarch64) (push) Successful in 29s
    Release / Linux AppImage (x86_64) (push) Successful in 28s
    Release / Cosign sign artifacts (push) Successful in 29s
    Release / Forgejo Release (push) Successful in 39s
    Stable

    dvb-projekt released this 2026-09-15 07:03:44 +00:00 | 253 commits to main since this release

    A patch release for one thing: the Umbrel sidecar port introduced in 1.28.0
    reached more of the pool than it should have. Details below; update if you
    run the app from the community store.

    Security

    • Umbrel: the LAN sidecar port (18335, added in 1.28.0) mapped straight
      onto the main API port, which also exposed the first-run setup wizard and
      /api/auth/bootstrap to the LAN — without the Umbrel login — until the
      owner had completed them. The port now maps to a new read-only API
      listener
      ([server].api_readonly_listen, env
      DVB_WARPPOOL_API_READONLY_LISTEN, container port 18339): GET/HEAD/OPTIONS
      only (plus the token-guarded POST /api/tune/push), /api/auth/* and
      /api/admin/* refused outright, never bound by the setup wizard. Sidecars
      keep reading /api/workers and /api/energy there.
      Installations of 1.28.0–1.30.0 that completed the wizard promptly were only
      exposed for that window; update anyway.

    Added

    • [server].api_readonly_listen (see above) for any deployment whose main
      port sits behind a login proxy but where a LAN sidecar needs pool data.

    dvb-WarpPool v1.30.1 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.30.1 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.30.0 944860dcae

    v1.30.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m41s
    CI / Rust fmt (push) Successful in 1m5s
    CI / Rust test (push) Successful in 5m56s
    CI / UI (SvelteKit) (push) Successful in 1m10s
    CI / Security Audit (push) Successful in 1m14s
    docs / build (push) Successful in 23m53s
    Release / Docker Multi-Arch (push) Successful in 23m32s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 12m29s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m35s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m4s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m49s
    Release / Linux AppImage (aarch64) (push) Successful in 19s
    Release / Linux AppImage (x86_64) (push) Successful in 20s
    Release / Cosign sign artifacts (push) Successful in 19s
    Release / Forgejo Release (push) Successful in 31s
    Stable

    dvb-projekt released this 2026-09-11 15:06:13 +00:00 | 262 commits to main since this release

    Added

    • Battery as its own energy origin. The energy card and the period
      overview now split the pool's kilowatt-hours three ways — solar, battery
      and grid — instead of two. Battery means solar that was stored during
      the day and consumed later; until now every one of those evening
      kilowatt-hours was booked as grid power, because the old check only
      compared production against load — with the sun down, production is zero
      and everything looks like grid. Battery kWh are priced like solar kWh
      (at nothing), so the cost figures drop accordingly.
      The attribution is marginal: the miners are the last consumer
      switched on, so their energy is charged against grid import first, then
      the battery, then direct PV — what would stop flowing if you unplugged
      them. The house average would credit the pool with stored solar that it
      did not actually free up.
    • scripts/anker-bridge.py reports the full power flows it already had in
      hand: battery_discharge_w, battery_charge_w, grid_w, feed_in_w
      and battery_soc_pct. New /raw.json diagnostic endpoint shows the
      power-related raw fields per Anker site — useful when Anker renames
      something, and it needs no second cloud login (the Anker cloud allows
      only one token per account, so a debug script would lock the bridge
      out).
    • Home Assistant provider: optional battery_discharge_entity_id,
      battery_charge_entity_id, grid_entity_id, feed_in_entity_id and
      battery_soc_entity_id — editable in the setup wizard and under
      Admin → Profile → Photovoltaics (collapsed "Battery sensors" group), or
      straight in config.toml. A failing optional entity degrades to
      "no battery split" instead of killing the snapshot; clearing a field in
      the admin form switches that sensor off again.
    • /api/energy gained last_24h_battery_kwh, last_7d_battery_kwh,
      lifetime_battery_kwh, and the solar object now carries
      battery_discharge_w, battery_charge_w, battery_soc_pct and mix
      (the live supply mix, i.e. exactly how the current minute is booked).
      /api/overview/period gained energy_battery_kwh per bucket and
      total_battery_kwh.

    Changed

    • Energy attribution is proportional instead of all-or-nothing wherever
      the provider reports battery discharge
      : a minute whose marginal load
      spans two sources counts as exactly that, where a 5-minute bucket
      previously tipped onto whichever side held the majority of its minutes.
      Without battery data (no storage, entities not configured, stale
      snapshot) the old yes/no decision still applies — but even those minutes
      are now summed individually instead of by bucket majority, so a bucket
      with 3 of 5 solar minutes reads 60 % solar rather than 100 %. Historic
      days outside the 7-day telemetry retention keep the split they were
      recorded with; the tariff decision (does PV surplus cover the pool?)
      stays a yes/no question and is unchanged.

    • Admin → Profile: the dvb-WarpTune card marks an empty sidecar URL and
      disables Save while the coupling is on — the server refuses that
      combination anyway, so the error no longer has to come back from the
      round trip.

    • scripts/setup-warptune.sh reads
      ~/Library/Application Support/dvb-WarpPool/warptune-push-token and
      writes it into the launchd plist as WARPTUNE_PUSH_TOKEN (plist stays
      0600), so the sidecar pushes its snapshot without a manual edit.

    Fixed

    • /api/overview/period priced all kilowatt-hours at the grid tariff,
      including self-generated ones — the week/month/year view charged for
      solar the energy card had already booked as free. Costs there now follow
      the grid share, matching /api/energy. Pools without PV are unaffected
      (grid share = total).
    • DB migration energy_battery_split_v1: solar_excess_minute gains
      share_solar/share_battery (NULL = fall back to the old boolean),
      daily_aggregates gains energy_battery_kwh. New lifetime carry key
      energy_lifetime_kwh_carry_battery.

    dvb-WarpPool v1.30.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.30.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.29.0 0e6ed05061

    v1.29.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m47s
    CI / Rust fmt (push) Successful in 1m13s
    CI / Rust test (push) Successful in 5m55s
    CI / UI (SvelteKit) (push) Successful in 1m18s
    CI / Security Audit (push) Successful in 1m17s
    docs / build (push) Successful in 2m16s
    Release / Docker Multi-Arch (push) Successful in 22m36s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 12m12s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m16s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m1s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m47s
    Release / Linux AppImage (aarch64) (push) Successful in 26s
    Release / Linux AppImage (x86_64) (push) Successful in 27s
    Release / Cosign sign artifacts (push) Successful in 27s
    Release / Forgejo Release (push) Successful in 36s
    Stable

    dvb-projekt released this 2026-09-11 10:55:31 +00:00 | 273 commits to main since this release

    The two pieces that were obviously missing the moment v1.28.0 shipped: the
    WarpTune coupling from the admin page instead of the config file, and the
    badge for miners of a public pool, whose sidecars the pool cannot reach.

    Added

    • Admin → Profile → dvb-WarpTune coupling: GET/POST /api/admin/tune
      edit [mining.tune] (enabled, sidecar URL, poll interval, stale
      threshold) and apply it live — the daemon's poll loop reads the shared
      config every tick, so switching the coupling on, off or to another URL
      needs no restart. Audit action tune.set.
    • Visitor push for public pools: the owner area of a wallet page creates a
      wallet-bound push token (POST/DELETE /api/users/{address}/tune-token,
      stored hashed, rotatable, revocable). A dvb-WarpTune sidecar with
      pool_push = true and the token in pool_push_token_env sends its
      snapshot to POST /api/tune/push every pool_push_secs (default 30 s).
      The pool keeps the latest snapshot per wallet in memory (stale after two
      minutes, dropped after an hour), caps the body at 256 KiB and 64 miners,
      accepts one push per ten seconds per wallet, and refuses a snapshot whose
      miners mine to another wallet. GET /api/users/{address} carries a tune
      object: full for the verified owner, reduced (rig, mode, state,
      frequency) for visitors once the owner turned Show badge to visitors on
      (POST /api/users/{address}/tune-public, wallet_prefs.tune_public).
      The wallet page shows a badge per rig; the owner area has the token and
      visibility controls. All in eight UI languages.
    • dvb-WarpTune journal entry push (state changes of the snapshot push) and
      a push: line in check-config.

    Changed

    • dvb-WarpTune's setup guide and setup script are in English now; the live
      confirmation of setup-warptune.sh --live answers to yes.

    dvb-WarpPool v1.29.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.29.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.28.0 12a2bee025

    v1.28.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m49s
    CI / Rust fmt (push) Successful in 1m14s
    CI / Rust test (push) Successful in 6m14s
    CI / UI (SvelteKit) (push) Successful in 1m18s
    CI / Security Audit (push) Successful in 1m22s
    docs / build (push) Successful in 8m24s
    Release / Docker Multi-Arch (push) Successful in 23m11s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 34m26s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m14s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m2s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m48s
    Release / Linux AppImage (aarch64) (push) Successful in 26s
    Release / Linux AppImage (x86_64) (push) Successful in 26s
    Release / Cosign sign artifacts (push) Successful in 30s
    Release / Forgejo Release (push) Successful in 37s
    Stable

    dvb-projekt released this 2026-09-11 08:59:51 +00:00 | 277 commits to main since this release

    dvb-WarpTune: an auto-clock for AxeOS miners as a sidecar next to the pool.
    It holds a temperature target by stepping frequency and core voltage along
    a per-board ladder, with guardrails the firmware does not have, and it
    takes what it needs from the pool: reject reasons per worker and the
    electricity picture. The pool shows what the sidecar does with each
    device. Nothing in the pool talks back to a miner.

    Added

    • New workspace crate warppool-tune and binary dvb-warppool-tune
      (apps/dvb-warppool-tune): the dvb-WarpTune regulator. Reads AxeOS
      telemetry (GET /api/system/info, NerdOS GET /api/v2/settings for the
      board's own option lists), decides on a ladder step every 30 s and, only
      with --live on the command line and live = true per miner, writes
      it back with PATCH /api/system. Guardrails: temperature bands with
      hysteresis and a failsafe one degree under the firmware's own line, VR
      temperature, input voltage and current limits taken from the firmware,
      a thermal power budget per board (thermal_r_c_per_w), a reason-aware
      reject guard, hashrate-vs-expected, step memory for unstable steps, a
      write circuit breaker, read-back verification of every write, and a
      restore of the point the miner had at start on shutdown, reboot or any
      trip. The voltage curve is anchored on the device's own operating point,
      so a hand-tuned miner is never pushed above its proven voltage. Modes
      eco, balanced, max (beyond-spec steps opt-in) and energy.
      Vendor tables for the BM1370 (Bitaxe Gamma) and the BitForge Nano;
      NerdOS boards (NerdAxe, NerdQaxe, NerdOctaxe) bring their own ladders.
    • dvb-WarpTune journal: one JSONL line per decision, write, verification,
      probe error, pool event and mode switch; dvb-warppool-tune journal
      renders it as a table, follows it live, and summarises per miner
      (temperature, power, hashrate, efficiency, proposals per hour, live
      writes, an ambient-based estimate of the board's cooling resistance).
      check-config, probe, ladder and example subcommands.
    • Pool coupling for the sidecar: with sidecar.pool_api set, a miner's
      share counters come from its /api/workers row (the pool attributes
      reject reasons, the firmware does not; ESP-Miner resets its counters on
      reconnect). The row is found through the device's own stratumUser,
      masked wallets included; pool = false or a per-miner pool_api for
      devices on another pool. [energy] enabled = true drives miners in
      energy mode from /api/energy: the surplus mode on PV surplus, Eco at
      or above the expensive rate, Balanced otherwise, with a minimum hold
      between switches.
    • [mining.tune] in the pool config: the daemon polls the sidecar's
      read-only GET /snapshot (tune_poll_loop, same shape as the solar
      provider). GET /api/tune returns the pool's copy with its age;
      /api/miners carries a tune object per device, joined by host,
      resolved IP or device hostname. The Miners tab and the device page show
      a WarpTune badge (mode, frequency, dry run / live / stale / control off)
      with the last decision as tooltip, in all eight UI languages.
    • macOS: scripts/setup-warptune.sh installs the sidecar as a launchd
      agent (dry run by default, --live asks once), with --restart,
      --stop (restores every live miner first), --status, --uninstall;
      guide in scripts/warptune-setup.md.

    Changed

    • Umbrel: the app now maps a second port, 18335 by default
      (APP_DVB_WARPPOOL_API_PORT), to the pool API without the app login, so
      a sidecar on the LAN can read /api/workers and /api/energy. It
      serves the same anonymous GETs as the public pool; the UI port stays
      behind the app proxy and admin endpoints still need a token.

    dvb-WarpPool v1.28.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.28.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.27.0 441bddea06

    v1.27.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m46s
    CI / Rust fmt (push) Successful in 1m12s
    CI / Rust test (push) Successful in 5m54s
    CI / UI (SvelteKit) (push) Successful in 1m19s
    CI / Security Audit (push) Successful in 1m18s
    docs / build (push) Successful in 36s
    Release / Docker Multi-Arch (push) Successful in 22m22s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 11m21s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m47s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m2s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m48s
    Release / Linux AppImage (aarch64) (push) Successful in 26s
    Release / Linux AppImage (x86_64) (push) Successful in 26s
    Release / Cosign sign artifacts (push) Successful in 26s
    Release / Forgejo Release (push) Successful in 36s
    Stable

    dvb-projekt released this 2026-09-10 08:16:57 +00:00 | 283 commits to main since this release

    A small release that closes the loop on node upkeep: the pool can now tell
    you when your Bitcoin Core is behind on its own release line, and the admin
    health page finally shows the node itself. Plus a quieter V1 log, a leaner
    release pipeline, and a debugging aid that helped an external Sv2 client
    author get talking to the pool in an afternoon.

    Added

    • Admin → Health now starts with a node card: Bitcoin Core version (plus
      newest release on the same line / overall when the release check is on),
      chain, block height / headers, peers, pruned / txindex, ZMQ endpoint,
      template source and last check times. Backed by the new admin endpoint
      GET /api/admin/health/node, which serves the daemon's last full
      node-health view. The suppress dropdown on that page also knows the three
      newer warning keys.
    • Health warning ipc_auto_fallback_socket_reachable: when
      template_source = "auto" fell back to GBT at start because the IPC socket
      was not there yet (Umbrel restarts the Bitcoin app and the pool together
      after a Bitcoin app update, and bitcoind binds its socket a few seconds
      later), the health tick keeps probing the socket and tells the operator to
      restart the pool once it answers.
    • Opt-in Bitcoin Core release check ([node].check_core_updates,
      core_update_check_hours): once a day the daemon fetches the Core release
      list and the health check raises bitcoin_core_update_available when a
      newer release exists on the node's own major line (bug-fix / security
      releases). Newer major lines are only reported as
      bitcoin.latest_core_release. Off by default — the pool never contacts a
      third party unless asked; the pool never updates Core itself.
    • noise_probe example in the warppool-stratum-v2 crate: a one-shot NOISE
      responder that runs the real handshake and reports per AEAD chunk whether
      a third-party client's first frame decrypts (header = key problem,
      payload-only = nonce problem). Documented under Troubleshooting → Sv2:
      debugging a client's handshake
      .

    Changed

    • Stratum V1: peer-side hangups (a TLS client or port scanner closing the
      socket without close_notify, connection resets, broken pipes) are now
      logged at debug as "connection dropped by peer" instead of warn. Oversized
      lines and decode errors still warn. Matches the Sv2 listener, which already
      logged connection errors at debug.
    • Release pipeline: the .deb/.rpm and AppImage jobs now reuse the
      binaries and UI built by the binaries job instead of compiling the
      workspace again per architecture. The v1.26.0 release run spent ~42 of
      its 84 serial runner minutes on those four redundant builds.

    dvb-WarpPool v1.27.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.27.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads
  • v1.26.0 29a91a7881

    v1.26.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m55s
    CI / Rust fmt (push) Successful in 1m10s
    CI / Rust test (push) Successful in 5m41s
    CI / UI (SvelteKit) (push) Successful in 1m16s
    CI / Security Audit (push) Successful in 1m18s
    docs / build (push) Successful in 36s
    Release / Docker Multi-Arch (push) Successful in 20m18s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 10m53s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 9m34s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 10m15s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 11m30s
    Release / Linux AppImage (aarch64) (push) Successful in 10m34s
    Release / Linux AppImage (x86_64) (push) Successful in 9m36s
    Release / Cosign sign artifacts (push) Successful in 26s
    Release / Forgejo Release (push) Successful in 37s
    Stable

    dvb-projekt released this 2026-09-07 11:33:16 +00:00 | 290 commits to main since this release

    The release that came out of measuring instead of guessing: the whole
    "new block → new job" chain was taken apart with microsecond timestamps on
    the reference pool and on an Umbrel Home, and most of what follows is what
    the numbers said to build. A full documentation sweep against the code went
    with it (details under Documentation).

    Added

    • Health warning when ZMQ is configured but silent. A pool whose
      zmq_hashblock_addr points at an unreachable or non-publishing socket
      used to fall back to the poll tick without a word — new blocks arrived up
      to job_refresh_secs late (Distortions observed 10–15 s stalls of this
      kind on other pools). The GBT template source now counts tip changes it
      discovered by polling while ZMQ watchers are configured; after two such
      tips the health banner shows bitcoin_zmq_hashblock_silent (suppressible,
      translated in all eight languages) and the log names the likely cause.
      A real ZMQ event resets the counter. Not applicable to the IPC template
      source, which pushes tips itself.
    • SIGTERM shuts the daemon down gracefully (Unix). docker stop and
      systemctl stop without a KillSignal override send SIGTERM, which used
      to kill the process outright: no flush of the rejected-share buffer, no
      clean session ends, no IPC template destroy. Now it triggers the same
      orderly shutdown as Ctrl-C.
    • [server] reuse_port binds every listener with SO_REUSEPORT, so a
      new daemon can take over the ports while the old one still serves — the
      basis for restarts without a listener gap (Packaging → Zero-downtime
      restart). Off by default, Unix only.
    • Fuzz-smoke tests for both protocol parsers run in the normal test
      suite: random bytes, mutated valid input and random frames through the
      Sv2 session state machine, plus noise and mutated JSON through the V1
      request parser and hex helpers — several thousand cases each, no panics
      allowed. Same entry points a libFuzzer target would use.
    • Template latency chain as metrics. Every template now carries its
      timing (source knew the tip → raw data fetched → mapped), the job loop
      logs tip_to_job_ms per new block, /api/overview carries the last
      values, and /metrics exports warppool_template_fetch_ms,
      warppool_template_map_ms and warppool_tip_to_job_ms. What the
      standalone probe measured on the reference box is now visible on every
      installation.
    • template_source = "auto" and DVB_WARPPOOL_TEMPLATE_SOURCE env
      override. The daemon probes the IPC socket once at start (configured
      path, or the Umbrel-derived one) and runs the IPC template source when
      the node answers, GBT otherwise — logged with the reason. Container
      deployments can set the env to auto so a Core ≥ 31 node with -ipcbind
      gets the 5–12 ms template path without anyone editing config.toml.
    • Per-IP connect limit before the Sv2 handshake. The Sv2 listener now
      shares the V1 rate limiter (connect bucket, auto-bans, IP gating), so a
      single IP has one budget across both ports. The NOISE handshake costs the
      server two ECDH operations and a Schnorr signature per attempt; a flood of
      connections could burn CPU without ever opening a session. Limited
      connections are dropped before act2, exactly like V1 connects.
    • Sv2 handshake diagnostics. Every stage of the NOISE handshake and the
      first frames after it now log at debug: act1 received, V1-on-Sv2-port
      detection, act1 rejected, act2 sent, peer closed without a frame (client
      rejected act2), first frame failed to decrypt (with the framing hint that
      bit more than one implementer: header as its own 22-byte AEAD chunk, then
      payload, no length prefix), the decoded SetupConnection fields, and the
      reason behind every SetupConnectionError. Troubleshooting page updated
      with the line-by-line reading guide.
    • Node tuning for block latency, measured and documented. The wizard's
      bitcoin.conf snippet now recommends blockreconstructionextratxn=1000
      when the key is absent: on the reference node the default extra pool
      (100) forced a compact-block round trip on every block, 1000 removed it
      on 10 of 36 blocks and cut the median reconstruction from 90–150 ms to
      60 ms. A new handbook page walks the whole chain — peering, reconstruction,
      validation, the cost of a restart, and how to measure it — with the numbers
      from the reference box and an Umbrel Home.
    • ipc-latency-probe (bitcoin-ipc crate binary): runs beside a pool
      against the same node and splits “node knows the block → template mapped”
      into ZMQ→waitNext, getBlock, the three small IPC calls, and the
      mapping step. IpcClient::fetch_parts_timed exposes the per-call
      durations for the same purpose.

    Changed

    • Umbrel package sets DVB_WARPPOOL_TEMPLATE_SOURCE=auto: with the
      Bitcoin app's IPC Mining Interface toggle on (Bitcoin app ≥ 1.3.0 / Core
      31), the pool takes the IPC template path automatically; otherwise it runs
      GBT + ZMQ exactly as before.
    • IPC template mapping runs in parallel across cores (order-preserving,
      scoped threads, templates ≥ 512 transactions); measured 43 → 28 ms median
      on the 4-vCPU reference box.

    Documentation

    • Full sweep against the code before this minor release. Corrected: the
      job_refresh_secs default (30 s via the CLI default, 90 s is the ESP32
      recommendation — the docs claimed 90), three places that still said a
      renewed TLS certificate needs a daemon restart (hot-reload has shipped
      since v1.22.0), the metrics' worker/wallet counter semantics after
      v1.25.6, SECURITY.md statements that no longer matched the code (unsafe
      inventory, CORS behaviour, UPnP "whitelist", non-existent external probes,
      IPv6 auto-ban scope, the HTTP-API rate limit behind a proxy, API-token
      scopes), README claims about TOTP replay protection, an APNs scaffold and
      /healthz contents, the reverse-proxy recipes (proxies must replace
      X-Forwarded-For, not append), ARCHITECTURE's schema column names, task
      list and "migrations", stale Sv2 phase notes, ten relative links that
      broke in the published handbook, and every version/test-count stamp. New
      handbook pages: Node Tuning for Block Latency, Peering Between Pools;
      new troubleshooting entries for silent ZMQ, Sv2 handshakes and
      low-difficulty diagnostics; the manuals carry the September 2026 edition.

    dvb-WarpPool v1.26.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.26.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads