Releases: shufps/ESP-Miner-NerdQAxePlus
v1.0.36-beta3
- TLS support #422
- refactoring: replace pool conditionals with registry-based quicklinks helper #441 @zcht
- Intermediate steps for frequency expanded in UI selection for Nerd Octaxe Gamma #440 @zcht
- Voltage range for NerdQX in UI expanded #439 @zcht
- NerdOctaxeGamma rev3.1 configuration and calibration #435 @BitMaker-hub
- Add AtlasPool.io dashboard link for AtlasPool.io users #430 @mweinberg
- show n/a as ping and loss on public pool #420
- added whitespace to hashSuffic and humanReadable pipe #419
- create session key when otp was enabled via config.cvs and it's empty #421
- changed public pool default port to 3333 #444
- show red alert banner if web UI version != fw version #454
- fix
#40000000 PSU Errorby not treating it as error #458 - adds POST to
/api/system/shutdownfor shutting down the miner #456 - moved some tasks to PSRAM (saves ~20kB RAM) #455
- increased API Fetcher stack size because it needed sometimes a little bit too much #453
- enlarge log window #450 @matlen67
- allow shutdown and restart without OTP #459
- let power manager run in shutdown to prevent stale values on the info endpoint #460
- added temp graphs (and some memory optimizitation on serializing json) #472 #474 #491 #474
- option to disable the "Found Block" screen #471
- added Best Difficulty Discord alert and moved discord alerter into an own task #470
- fix shutdown log message #468
- removed 'asdf' tooltip^^ #467
- show input current with warn color if close to the fuse value #451 @zcht
- increase stack of OTA updater #473
- Allow 160A on NerdOctaxe Gamma with TPS53647 #479
- added median filter to filter out invalid hashrate readings #477
- fix input current reading on Nerdaxe Gamma #490
- close websocket on disconnect #489
- improve chart readability in an extra experimental dashboard #476 @zcht
- refactor (logs): stabilize virtual scroll, improve autoscroll & memory handling #475 @zcht
v1.0.36-beta2
- TLS support #422
- refactoring: replace pool conditionals with registry-based quicklinks helper #441 @zcht
- Intermediate steps for frequency expanded in UI selection for Nerd Octaxe Gamma #440 @zcht
- Voltage range for NerdQX in UI expanded #439 @zcht
- NerdOctaxeGamma rev3.1 configuration and calibration #435 @BitMaker-hub
- Add AtlasPool.io dashboard link for AtlasPool.io users #430 @mweinberg
- show n/a as ping and loss on public pool #420
- added whitespace to hashSuffic and humanReadable pipe #419
- create session key when otp was enabled via config.cvs and it's empty #421
- changed public pool default port to 3333 #444
- show red alert banner if web UI version != fw version #454
- fix
#40000000 PSU Errorby not treating it as error #458 - adds POST to
/api/system/shutdownfor shutting down the miner #456 - moved some tasks to PSRAM (saves ~20kB RAM) #455
- increased API Fetcher stack size because it needed sometimes a little bit too much #453
- enlarge log window #450 @matlen67
- allow shutdown and restart without OTP #459
- let power manager run in shutdown to prevent stale values on the info endpoint #460
- added temp graphs (and some memory optimizitation on serializing json) #472 #474
- option to disable the "Found Block" screen #471
- added Best Difficulty Discord alert and moved discord alerter into an own task #470
- fix shutdown log message #468
- removed 'asdf' tooltip^^ #467
- show input current with warn color if close to the fuse value #451 @zcht
- increase stack of OTA updater #473
- Allow 160A on NerdOctaxe Gamma with TPS53647 #479
- added median filter to filter out invalid hashrate readings #477
v1.0.36-beta1
- TLS support #422
- refactoring: replace pool conditionals with registry-based quicklinks helper #441 @zcht
- Intermediate steps for frequency expanded in UI selection for Nerd Octaxe Gamma #440 @zcht
- Voltage range for NerdQX in UI expanded #439 @zcht
- NerdOctaxeGamma rev3.1 configuration and calibration #435 @BitMaker-hub
- Add AtlasPool.io dashboard link for AtlasPool.io users #430 @mweinberg
- show n/a as ping and loss on public pool #420
- added whitespace to hashSuffic and humanReadable pipe #419
- create session key when otp was enabled via config.cvs and it's empty #421
- changed public pool default port to 3333 #444
- show red alert banner if web UI version != fw version #454
- fix
#40000000 PSU Errorby not treating it as error #458 - adds POST to
/api/system/shutdownfor shutting down the miner #456 - moved some tasks to PSRAM (saves ~20kB RAM) #455
- increased API Fetcher stack size because it needed sometimes a little bit too much #453
- enlarge log window #450 @matlen67
- allow shutdown and restart without OTP #459
- let power manager run in shutdown to prevent stale values on the info endpoint #460
- added temp graphs (and some memory optimizitation on serializing json) #472 #474
- option to disable the "Found Block" screen #471
- added Best Difficulty Discord alert and moved discord alerter into an own task #470
- fix shutdown log message #468
- removed 'asdf' tooltip^^ #467
- show input current with warn color if close to the fuse value #451 @zcht
- increase stack of OTA updater #473
v1.0.36-test6
- TLS support #422
- refactoring: replace pool conditionals with registry-based quicklinks helper #441 @zcht
- Intermediate steps for frequency expanded in UI selection for Nerd Octaxe Gamma #440 @zcht
- Voltage range for NerdQX in UI expanded #439 @zcht
- NerdOctaxeGamma rev3.1 configuration and calibration #435 @BitMaker-hub
- Add AtlasPool.io dashboard link for AtlasPool.io users #430 @mweinberg
- show n/a as ping and loss on public pool #420
- added whitespace to hashSuffic and humanReadable pipe #419
- create session key when otp was enabled via config.cvs and it's empty #421
- changed public pool default port to 3333 #444
- show red alert banner if web UI version != fw version #454
- fix
#40000000 PSU Errorby not treating it as error #458 - adds POST to
/api/system/shutdownfor shutting down the miner #456 - moved some tasks to PSRAM (saves ~20kB RAM) #455
- increased API Fetcher stack size because it needed sometimes a little bit too much #453
- enlarge log window #450 @matlen67
- allow shutdown and restart without OTP #459
- let power manager run in shutdown to prevent stale values on the info endpoint #460
v1.0.36-test1
- TLS support #422
- refactoring: replace pool conditionals with registry-based quicklinks helper #441 @zcht
- Intermediate steps for frequency expanded in UI selection for Nerd Octaxe Gamma #440 @zcht
- Voltage range for NerdQX in UI expanded #439 @zcht
- NerdOctaxeGamma rev3.1 configuration and calibration #435 @BitMaker-hub
- Add AtlasPool.io dashboard link for AtlasPool.io users #430 @mweinberg
- show n/a as ping and loss on public pool #420
- added whitespace to hashSuffic and humanReadable pipe #419
- create session key when otp was enabled via config.cvs and it's empty #421
- changed public pool default port to 3333 #444
v1.0.35
Summary
Dual Pool
The firmware now supports true Dual Pool mining, allowing the device to mine on two pools in parallel. Jobs from both pools are interleaved at the default job-switching interval (500 ms on BM1370 devices), without disconnecting or alternating Stratum sessions. Each pool receives a continuous stream of work and reports its assigned hashrate accurately. Dual Pool is supported on all Nerd*Axes — including the smallest NerdAxe with a single BM1366.
Under the hood, jobs from both Stratum connections are multiplexed into a single ASIC job stream using a Bresenham-based load-balancing algorithm. Returned nonces are routed back exclusively to the pool that provided the corresponding job.
The pool ratio can be configured in 1% increments. For example, an 80%/20% split allocates 80% of the hashrate to Pool 1 and 20% to Pool 2.
Note: At extremely low ratios (e.g., 99%/1%), a pool may attempt to reduce its difficulty below the ASIC’s minimum supported hardware difficulty. Mining continues to function correctly and all shares remain valid, but the pool’s hashrate estimate may become inaccurate. When this occurs, the UI marks the affected pool with an orange badge and a tooltip indicating that the ratio is too low.
Stratum Settings Reload
When you change and save Stratum settings — such as host, port, username, password, or the Dual Pool balance — the miner now reloads the configuration immediately and reconnects to the pools on the spot.
A reboot is no longer required.
Graphs switched to Chip Hashrate
In v1.0.34.1, the main hashrate display (top left, above “Expected Hashrate”) was already updated to use the more accurate Chip Hashrate. However, the graph still showed the older Stratum-share-based estimation.
This has now been unified: the graphs also use Chip Hashrate.
Because the new measurement stabilizes much faster, a 1-minute graph has been added as well.
Soft Power-Off
Holding both buttons for 5 seconds triggers a Soft Power-Off.
The miner disables the ASIC voltage regulator and suspends all running tasks, allowing you to safely shut down the device before disconnecting it from power.
HTTP Server Improvements
The ESP32 HTTP server now reliably terminates all HTTP connections on its own, preventing lingering or half-open sockets and avoiding socket exhaustion.
This should finally resolve the long-standing Web-UI unavailability issues that were reported repeatedly over the past several months.
PRs:
- handle file not found errors properly (prevents weird error with first page load empty after update) #415
- revised websocket handling. Fixes corrupted http API response when switching from the log view to e.g. dashboard #414
- switch
bestDiffandbestSessionDifftonumberon the API #410 - wait for display animations to be finished before new page changes are possible (fixes fw crash on multiple presses of the page switch button) #409
- toggle pool information on pool settings page on the display in dual pool mode #406
- revised alerting for the VREG #348
- don't print chip temps when all are 0 #373
- force closing http connections from esp32 http server side #374
- fix language caching #375
- fixed inconsistent use of
fanspeedfield #378 - added soft-power off (press both buttons for 5s) #376
- use hashrate from chip registers instead of estimated stratum shares #384
- Added 1m graph #384
- switched to free running counters for better accuray #384
- save visibility of graphs in the browser store #384
- optimized PSRAM usage (reduced by approx 2.5MB) #384
- refactored code (for example
ping_task.cpp/hthat is now c++ object and instantiated two times, for each pool conection once) #384 - finished integrating dual pool feature into the web UI #384
- allow empty wifi password and open wifi auth #397
- reload stratum config and reconnect if it changed without reboot #398
- fixed
fallbackStratumPasswordthat was saved as*****#398 - swarm supports dual pool too now #397
- removed fan auto polarity detection and disabled invertPolarity config flag once via config migration (and fixed default invert polarity flag for nerdaxes and fixed emc2101 init code) #403
- fix display autoscreen-off #405
v1.0.35-beta2
beta2:
- handle file not found errors properly (prevents weird error with first page load empty after update) #415
- revised websocket handling. Fixes corrupted http API response when switching from the log view to e.g. dashboard #414
- switch
bestDiffandbestSessionDifftonumberon the API #410 - wait for display animations to be finished before new page changes are possible (fixes fw crash on multiple presses of the page switch button) #409
- toggle pool information on pool settings page on the display in dual pool mode #406
from beta1:
- revised alerting for the VREG #348
- don't print chip temps when all are 0 #373
- force closing http connections from esp32 http server side #374
- fix language caching #375
- fixed inconsistent use of
fanspeedfield #378 - added soft-power off (press both buttons for 5s) #376
- use hashrate from chip registers instead of estimated stratum shares #384
- Added 1m graph #384
- switched to free running counters for better accuray #384
- save visibility of graphs in the browser store #384
- optimized PSRAM usage (reduced by approx 2.5MB) #384
- refactored code (for example
ping_task.cpp/hthat is now c++ object and instantiated two times, for each pool conection once) #384 - finished integrating dual pool feature into the web UI #384
- allow empty wifi password and open wifi auth #397
- reload stratum config and reconnect if it changed without reboot #398
- fixed
fallbackStratumPasswordthat was saved as*****#398 - swarm supports dual pool too now #397
- removed fan auto polarity detection and disabled invertPolarity config flag once via config migration (and fixed default invert polarity flag for nerdaxes and fixed emc2101 init code) #403
- fix display autoscreen-off #405
v1.0.34.1
Version 1.0.34.1 – Summary
The 1.0.34.1 release introduces OTP protection, one-click firmware updates, multi-language support, and NerdQX and "6 phase" NerdOctaxe-Gamma (aka 6ph-Ocho 🤪) integration — along with numerous fixes and refinements for improved stability.
OTP
The release adds One-Time Password (OTP) security — a much more robust alternative to static web passwords.
The device now supports registering Authy or Google Authenticator via a QR code displayed on its screen, providing a lightweight, local second factor for the Web UI — without requiring TLS. During setup, you simply scan the QR code with your authenticator app. From then on, sensitive actions such as changing the BTC address or key settings must be confirmed using a 6-digit TOTP code.
Unlike fixed “admin passwords,” these codes are derived from a random secret using HMAC-SHA1 and time-based counters. They change every 30 seconds, cannot be reused, and are never exposed in the Web UI. This makes them immune to guessing, sharing, or accidental leaks.
While TOTP is not a full authentication solution for exposed setups (HTTPS with proper credentials is still recommended), it adds strong, pragmatic protection for LAN-only use — a real cryptographic barrier against trivial misuse over plain HTTP.
GitHub One-Click Update
Another major improvement is the one-click firmware update, which lets users easily select and install any available firmware version, including pre-releases. Once started, the update runs as a background task — independent of the HTTP server — for maximum reliability.
Previously, while firmware OTA updates already used a dedicated secondary partition for safety, the web interface (www) partition had to be updated directly from browser uploads. This was fragile: reloads, timeouts, or network hiccups could corrupt the partition and require recovery mode.
The new approach downloads the entire web partition in the background first, then applies the update in one atomic step — eliminating corruption risks almost entirely. As a result, web updates are now faster, safer, and far more robust.
This feature was a collaborative effort between @foXaCe and @shufps.
Language Support
Many thanks to @foXaCe, who contributed full translation support and localization for four different languages!
NerdQX
The release also introduces NerdQX support, which brought extensive internal refactoring. One of the larger changes was a revision of the display state machine and the power manager loop. The latter now operates with a fixed timer interval, improving the PID controller’s accuracy by ensuring a consistent sampling frequency.
NerdOctaxe-Gamma with 6 phases
The release also adds support for the new 6-phase NerdOctaxe-Gamma. Developed by @BitMaker-hub, this enhanced design introduces two extra power phases, resulting in improved thermal efficiency and much higher overclocking potential.
Miscellaneous
1.0.34 includes numerous bug fixes and stability improvements. Version 1.0.33 had to be withdrawn after reports of black screens, Wi-Fi crashes, and other issues — traced back to the ESP-IDF 5.3.3 toolchain. Reverting to ESP-IDF 5.3 resolved these problems, and 1.0.34 restores full stability.
From 1.0.33
That release brought major improvements to hashrate accuracy, monitoring, and stability. Hashrate is now read directly from the ASICs, providing instant precision. Additional enhancements include one-minute metrics, duplicate share tracking, extranonce subscription for better pool compatibility, and Discord block notifications and the BTC price ticker was fixed, and ESP-IDF was updated to 5.3.3.
Changelog
Fixes and Improvements in 1.0.34
- Fixed wrong bestDiff / bestSessDiff values on Swarm for BitAxes (#351)
- Added ~12.5 W headroom for NerdQAxe++ to ensure stable operation at 800 MHz / 1250 mV (#347)
- Fixed LVGL realloc implementation — the previous version was inconsistent and potentially incorrect (#344)
- Allowed web update and restart without OTP in recovery mode (#341)
- Revised CORS handling (#335)
- Revised file handler implementation (#336)
- Made lwIP use PSRAM (#352)
- Fixed saving endpoint for Discord alerts — the Web UI used the wrong one after OTP integration (#334)
- Fixed AP connection logic and automatic recovery after Wi-Fi outages (#332)
- Fixed static XXXX SSID display on the portal screen (#332)
- Added OTP with “remember this device for 24 h” session tokens (#317, #318, #319, #363)
- Added direct GitHub updates with release selection, changelog preview, and pre-release option (#313, #328, thanks to @foXaCe and @shufps)
- Added NerdQX support (#310)
- Added full Web UI translation in four languages (#290, @foXaCe)
- Added ping loss % display on the dashboard (#293, @Aga-UU)
- Reverted ESP-IDF 5.3.3 to 5.3 to fix Wi-Fi crashes 🙈 (#339)
- 6 phase NerdOctaxe-Gamma support @BitMaker-hub (#365)
- quick-link to solomining pool (#362)
- fan metrics are not pushed to influx (#360)
Changes previously introduced in 1.0.33
- Uses hardware hash counter registers on BM1366, BM1368, and BM1370 for accurate hashrate reporting (#276, #279, #280, #283, #294)
- Added hashrate_1m metric to InfluxDB for finer monitoring (#286)
- Device now counts duplicate shares for improved stability insight (#273)
- Added extranonce subscribe option for pool compatibility (e.g. Nicehash) (#270)
- Added Discord webhook alerts when a block is found (#269)
- Exported found block variable on the info endpoint (#267)
- Fixed BTC price ticker (and updated ESP-IDF from 5.3 → 5.3.3) (#265)
v1.0.33-rc1
- using hardware hash counter registers on BM1366, BM1368 and BM1370 for better hashrate #276 #279 #280 #283 #294
- added hashrate_1m to influx #286
- count duplicate shares on the device #273
- added extranonce subscribe option for pools that need it like Nicehash #270
- added discord webhook for alterts when a block is found #269
- export the found block variable on the info endpoint #267
- backports
connection.cfrom Bitaxe ESP-Miner because it was a lot mature than the version before #265 (solves some issues: #226 ) - fixes the BTC price ticker (and esp-idf update to 5.3.3 from 5.3) #265
v1.0.32.1
Summary
In v1.0.32, the OTA update process introduced overly aggressive hardware locking. This prevented the PID fan control from running during the update, which could potentially lead to overheating.
This issue has been fixed by:
Blocking concurrent flashing and I²C access during www.bin updates, while still allowing task switches after each page write, so the PID control loop can continue to run normally.
Powering down the buck converter during firmware updates, eliminating any risk of overheating. (Since the device reboots afterwards, this causes no side effects.)