-
v1.34.0
StableAll checks were successfulRelease / Docker Multi-Arch (push) Successful in 22m31sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 11m22sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m6sCI / Rust clippy (push) Successful in 1m48sCI / Rust fmt (push) Successful in 1m12sCI / Rust test (push) Successful in 5m48sCI / UI (SvelteKit) (push) Successful in 1m15sCI / Security Audit (push) Successful in 1m21sdocs / build (push) Successful in 37sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m0sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m51sRelease / Linux AppImage (aarch64) (push) Successful in 28sRelease / Linux AppImage (x86_64) (push) Successful in 27sRelease / Cosign sign artifacts (push) Successful in 25sRelease / Forgejo Release (push) Successful in 37sreleased this
2026-09-27 12:10:44 +00:00 | 209 commits to main since this releaseFixed
- 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,chainPhaseother thanREADY); 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 inFAILEDis 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(getreads,setwrites) 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 its1/√shareserror), 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).
--jsonfor 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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
1 download
- dvb-WarpTune energy mode: without the pool's energy feed a miner holds
-
v1.33.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m59sCI / Rust fmt (push) Successful in 1m16sCI / Rust test (push) Successful in 6m22sCI / UI (SvelteKit) (push) Successful in 1m19sCI / Security Audit (push) Successful in 1m19sdocs / build (push) Successful in 35sRelease / Docker Multi-Arch (push) Successful in 23m13sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 11m47sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m31sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m3sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m51sRelease / Linux AppImage (aarch64) (push) Successful in 26sRelease / Linux AppImage (x86_64) (push) Successful in 27sRelease / Cosign sign artifacts (push) Successful in 25sRelease / Forgejo Release (push) Successful in 38sreleased this
2026-09-24 05:46:46 +00:00 | 219 commits to main since this releaseAdded
- 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 withshutdown: false, no fault flag and
its unchanged nominal hashrate in the API — power was the only honest
reading — and the regulator stood insettling 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_mhzper 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_mvper 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_changedline, 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_pollscounted telemetry ticks
(every 5 s) instead of pool feed readings (everypoll_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'ssurplus_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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- dvb-WarpTune energy mode:
-
v1.32.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m50sCI / Rust fmt (push) Successful in 1m14sCI / Rust test (push) Successful in 6m3sCI / UI (SvelteKit) (push) Successful in 1m17sCI / Security Audit (push) Successful in 1m20sdocs / build (push) Successful in 36sRelease / Docker Multi-Arch (push) Successful in 22m58sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 12m12sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m34sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m6sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m55sRelease / Linux AppImage (aarch64) (push) Successful in 27sRelease / Linux AppImage (x86_64) (push) Successful in 27sRelease / Cosign sign artifacts (push) Successful in 29sRelease / Forgejo Release (push) Successful in 38sreleased this
2026-09-19 18:05:42 +00:00 | 245 commits to main since this releaseAdded
- 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(defaulttrue). A house smart meter reports
the whole house load, miners included, so the surplus flag now needs
pv − consumption ≥ surplus_buffer_winstead 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 tofalsefor 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 fullmin_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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- dvb-WarpTune energy mode:
-
v1.31.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m51sCI / Rust fmt (push) Successful in 1m16sCI / Rust test (push) Successful in 6m13sCI / UI (SvelteKit) (push) Successful in 1m16sCI / Security Audit (push) Successful in 1m21sdocs / build (push) Successful in 36sRelease / Docker Multi-Arch (push) Successful in 23m39sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 11m45sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m12sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m7sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m56sRelease / Linux AppImage (aarch64) (push) Successful in 27sRelease / Linux AppImage (x86_64) (push) Successful in 26sRelease / Cosign sign artifacts (push) Successful in 28sRelease / Forgejo Release (push) Successful in 36sreleased this
2026-09-16 11:55:46 +00:00 | 249 commits to main since this releaseThe 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:
rustls0.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
withrustls-webpki0.103.15 andaws-lc-rs1.18.1 /aws-lc-sys0.45.0;
chacha200.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 isascset workmode;
failsafe 100 °C, write verification 60 s, settle 180 s, judged on the
15-minute hashrate.dvb-warppool-tune probe <host> --kind avalonshows
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 reportedsmallCoreCountinstead 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
identifiercom.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_cbelow 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 onsqlx-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.headersand 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 byprobe.
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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
1 download
- Dependencies:
-
v1.30.1
StableSome checks failedCI / Rust clippy (push) Successful in 1m54sCI / Rust fmt (push) Successful in 1m14sCI / Rust test (push) Successful in 6m12sCI / UI (SvelteKit) (push) Successful in 1m21sCI / Security Audit (push) Failing after 1m22sdocs / build (push) Successful in 41sRelease / Docker Multi-Arch (push) Successful in 24m5sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 12m41sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 11m39sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m8sRelease / Linux .deb + .rpm (arm64) (push) Successful in 2m3sRelease / Linux AppImage (aarch64) (push) Successful in 29sRelease / Linux AppImage (x86_64) (push) Successful in 28sRelease / Cosign sign artifacts (push) Successful in 29sRelease / Forgejo Release (push) Successful in 39sreleased this
2026-09-15 07:03:44 +00:00 | 253 commits to main since this releaseA 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/bootstrapto 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-guardedPOST /api/tune/push),/api/auth/*and
/api/admin/*refused outright, never bound by the setup wizard. Sidecars
keep reading/api/workersand/api/energythere.
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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
- Umbrel: the LAN sidecar port (
-
v1.30.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m41sCI / Rust fmt (push) Successful in 1m5sCI / Rust test (push) Successful in 5m56sCI / UI (SvelteKit) (push) Successful in 1m10sCI / Security Audit (push) Successful in 1m14sdocs / build (push) Successful in 23m53sRelease / Docker Multi-Arch (push) Successful in 23m32sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 12m29sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m35sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m4sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m49sRelease / Linux AppImage (aarch64) (push) Successful in 19sRelease / Linux AppImage (x86_64) (push) Successful in 20sRelease / Cosign sign artifacts (push) Successful in 19sRelease / Forgejo Release (push) Successful in 31sreleased this
2026-09-11 15:06:13 +00:00 | 262 commits to main since this releaseAdded
- 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.pyreports the full power flows it already had in
hand:battery_discharge_w,battery_charge_w,grid_w,feed_in_w
andbattery_soc_pct. New/raw.jsondiagnostic 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_idand
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/energygainedlast_24h_battery_kwh,last_7d_battery_kwh,
lifetime_battery_kwh, and thesolarobject now carries
battery_discharge_w,battery_charge_w,battery_soc_pctandmix
(the live supply mix, i.e. exactly how the current minute is booked).
/api/overview/periodgainedenergy_battery_kwhper 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.shreads
~/Library/Application Support/dvb-WarpPool/warptune-push-tokenand
writes it into the launchd plist asWARPTUNE_PUSH_TOKEN(plist stays
0600), so the sidecar pushes its snapshot without a manual edit.
Fixed
/api/overview/periodpriced 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_minutegains
share_solar/share_battery(NULL = fall back to the old boolean),
daily_aggregatesgainsenergy_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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
- Battery as its own energy origin. The energy card and the period
-
v1.29.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m47sCI / Rust fmt (push) Successful in 1m13sCI / Rust test (push) Successful in 5m55sCI / UI (SvelteKit) (push) Successful in 1m18sCI / Security Audit (push) Successful in 1m17sdocs / build (push) Successful in 2m16sRelease / Docker Multi-Arch (push) Successful in 22m36sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 12m12sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m16sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m1sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m47sRelease / Linux AppImage (aarch64) (push) Successful in 26sRelease / Linux AppImage (x86_64) (push) Successful in 27sRelease / Cosign sign artifacts (push) Successful in 27sRelease / Forgejo Release (push) Successful in 36sreleased this
2026-09-11 10:55:31 +00:00 | 273 commits to main since this releaseThe 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 actiontune.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 = trueand the token inpool_push_token_envsends its
snapshot toPOST /api/tune/pusheverypool_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 atune
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
apush:line incheck-config.
Changed
- dvb-WarpTune's setup guide and setup script are in English now; the live
confirmation ofsetup-warptune.sh --liveanswers toyes.
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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Admin → Profile → dvb-WarpTune coupling:
-
v1.28.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m49sCI / Rust fmt (push) Successful in 1m14sCI / Rust test (push) Successful in 6m14sCI / UI (SvelteKit) (push) Successful in 1m18sCI / Security Audit (push) Successful in 1m22sdocs / build (push) Successful in 8m24sRelease / Docker Multi-Arch (push) Successful in 23m11sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 34m26sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m14sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m2sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m48sRelease / Linux AppImage (aarch64) (push) Successful in 26sRelease / Linux AppImage (x86_64) (push) Successful in 26sRelease / Cosign sign artifacts (push) Successful in 30sRelease / Forgejo Release (push) Successful in 37sreleased this
2026-09-11 08:59:51 +00:00 | 277 commits to main since this releasedvb-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-tuneand binarydvb-warppool-tune
(apps/dvb-warppool-tune): the dvb-WarpTune regulator. Reads AxeOS
telemetry (GET /api/system/info, NerdOSGET /api/v2/settingsfor the
board's own option lists), decides on a ladder step every 30 s and, only
with--liveon the command line andlive = trueper miner, writes
it back withPATCH /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) andenergy.
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,ladderandexamplesubcommands. - Pool coupling for the sidecar: with
sidecar.pool_apiset, a miner's
share counters come from its/api/workersrow (the pool attributes
reject reasons, the firmware does not; ESP-Miner resets its counters on
reconnect). The row is found through the device's ownstratumUser,
masked wallets included;pool = falseor a per-minerpool_apifor
devices on another pool.[energy] enabled = truedrives miners in
energymode 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-onlyGET /snapshot(tune_poll_loop, same shape as the solar
provider).GET /api/tunereturns the pool's copy with its age;
/api/minerscarries atuneobject 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.shinstalls the sidecar as a launchd
agent (dry run by default,--liveasks once), with--restart,
--stop(restores every live miner first),--status,--uninstall;
guide inscripts/warptune-setup.md.
Changed
- Umbrel: the app now maps a second port,
18335by default
(APP_DVB_WARPPOOL_API_PORT), to the pool API without the app login, so
a sidecar on the LAN can read/api/workersand/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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- New workspace crate
-
v1.27.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m46sCI / Rust fmt (push) Successful in 1m12sCI / Rust test (push) Successful in 5m54sCI / UI (SvelteKit) (push) Successful in 1m19sCI / Security Audit (push) Successful in 1m18sdocs / build (push) Successful in 36sRelease / Docker Multi-Arch (push) Successful in 22m22sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 11m21sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 10m47sRelease / Linux .deb + .rpm (amd64) (push) Successful in 2m2sRelease / Linux .deb + .rpm (arm64) (push) Successful in 1m48sRelease / Linux AppImage (aarch64) (push) Successful in 26sRelease / Linux AppImage (x86_64) (push) Successful in 26sRelease / Cosign sign artifacts (push) Successful in 26sRelease / Forgejo Release (push) Successful in 36sreleased this
2026-09-10 08:16:57 +00:00 | 283 commits to main since this releaseA 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 raisesbitcoin_core_update_availablewhen 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_probeexample in thewarppool-stratum-v2crate: 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 withoutclose_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/.rpmand AppImage jobs now reuse the
binaries and UI built by thebinariesjob 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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Admin → Health now starts with a node card: Bitcoin Core version (plus
-
v1.26.0
StableAll checks were successfulCI / Rust clippy (push) Successful in 1m55sCI / Rust fmt (push) Successful in 1m10sCI / Rust test (push) Successful in 5m41sCI / UI (SvelteKit) (push) Successful in 1m16sCI / Security Audit (push) Successful in 1m18sdocs / build (push) Successful in 36sRelease / Docker Multi-Arch (push) Successful in 20m18sRelease / Binary aarch64-unknown-linux-gnu (push) Successful in 10m53sRelease / Binary x86_64-unknown-linux-gnu (push) Successful in 9m34sRelease / Linux .deb + .rpm (amd64) (push) Successful in 10m15sRelease / Linux .deb + .rpm (arm64) (push) Successful in 11m30sRelease / Linux AppImage (aarch64) (push) Successful in 10m34sRelease / Linux AppImage (x86_64) (push) Successful in 9m36sRelease / Cosign sign artifacts (push) Successful in 26sRelease / Forgejo Release (push) Successful in 37sreleased this
2026-09-07 11:33:16 +00:00 | 290 commits to main since this releaseThe 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_addrpoints at an unreachable or non-publishing socket
used to fall back to the poll tick without a word — new blocks arrived up
tojob_refresh_secslate (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 showsbitcoin_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 stopand
systemctl stopwithout aKillSignaloverride send SIGTERM, which used
to kill the process outright: no flush of the rejected-share buffer, no
clean session ends, no IPC templatedestroy. Now it triggers the same
orderly shutdown as Ctrl-C. [server] reuse_portbinds every listener withSO_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
logstip_to_job_msper new block,/api/overviewcarries the last
values, and/metricsexportswarppool_template_fetch_ms,
warppool_template_map_msandwarppool_tip_to_job_ms. What the
standalone probe measured on the reference box is now visible on every
installation. template_source = "auto"andDVB_WARPPOOL_TEMPLATE_SOURCEenv
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 toautoso 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 atdebug: 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 decodedSetupConnectionfields, and the
reason behind everySetupConnectionError. Troubleshooting page updated
with the line-by-line reading guide. - Node tuning for block latency, measured and documented. The wizard's
bitcoin.confsnippet now recommendsblockreconstructionextratxn=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_timedexposes 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_secsdefault (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
/healthzcontents, 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.pubin the repo root):cosign verify-blob \ --key cosign.pub \ --bundle SHA256SUMS.bundle \ SHA256SUMS sha256sum --check SHA256SUMSFirst-time setup: run
dvb-warppool-setupfor the first-run wizard.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Health warning when ZMQ is configured but silent. A pool whose