Update release
Miners
- update miner BzMiner to v100.41 (amd,cpu,intel,nvidia)
- update miner CcminerTpfuemp to v2026.09.1 (nvidia)
- update miner FiroPOWAmd to v1.5.2 (amd)
- update miner FiroPOWNvidia to v1.5.2 (nvidia)
- update miner SrbminerMulti to v3.7.1 (amd,cpu,intel,nvidia)
- update miner Wildrig to v0.51.3 (amd,intel,nvidia)
- Fix CpuminerRplant CPU affinity on Linux
- with --no-smart cpuminer-rplant 5.0.46 pins every worker thread to CPU 0 in pool mode on Linux
- its smart mode honors the mask there (verified with high and mixed masks), so the switch is Windows-only now
- update miner EvrProgPOWNvidia
- exit on GPU errors, a hung miner kept reporting its old hashrate
- update miner FiroPOWAmd
- exit on GPU errors, a hung firominer kept reporting its old hashrate
- update miner FiroPOWNvidia
- exit on GPU errors, a hung firominer kept reporting its old hashrate
- update miner Nsfminer
- exit on GPU errors, a hung miner kept reporting its old hashrate
- update miner ProgPOWAmd
- exit on GPU errors, a hung miner kept reporting its old hashrate
- update miner ProgPOWEthercoreAmd
- exit on GPU errors, a hung miner kept reporting its old hashrate
- update miner ProgPOWEthercoreNvidia
- exit on GPU errors, a hung miner kept reporting its old hashrate
- update miner ProgPOWNvidia
- exit on GPU errors, a hung miner kept reporting its old hashrate
- update miner SccMiner
- exit on GPU errors, a hung miner kept reporting its old hashrate
Pools
- Fix Pearlhash failing to load on PowerShell 7
- add -fixbigint to the pool stats API call: the pool hashrate has grown past Int64.MaxValue, so ConvertFrom-Json returns a BigInteger on PS7, which arrives as a deserialized property bag after the async job hop and no longer binds to Set-Stat -HashRate ("Cannot convert ... IsPowerOfTwo=False ... to System.Double")
- add -fixbigint to the balance API call as well, /api/account returns 20-digit worker_id values
- update balances Wallet
- remember a NiceHash BTC wallet that is no external mining address, instead of probing it every balance round (400 NOT_FOUND)
- update pool Kryptex - resolve the account login (wallet, mining username or email) in InfoOnly mode as well, the MRR pool data listing had rows without a user - drop coins without direct mining for the mining username in InfoOnly mode, as in normal mode
- update pool MiningDutch - skip algorithms without a stratum port: the pool API stopped delivering ports, a port 0 pool is unusable for miners and MiningRigRentals rejects it - log the skipped algorithms once per refresh
- update pool MiningRigRentals - require a stratum port when selecting the rig pool, a port 0 entry made the pool update fail every round with "Missing One or More Required Fields"
- update pool MiningRigRentals - use a fallback pool per algorithm from mrrpoolsalt.json for the auto benchmark and as second rig pool on MRR - plan the rig pool slots, keep the fallback behind the primary, refresh the pool snapshot after every write - recognise the unMineable and KevaOne pool entries as own pools, they were re-added every run - skip the pool update when the pool snapshot could not be fetched
- update pool Zpool
- skip the firopow port when it mines SCC: it is StakeCube with the Firo DAG profile, not Firo, and SCC is offered as SCCPow on the sccpow port (#2997)
- update pool ZpoolCoins
- skip SCC on the firopow port, SCC is offered as SCCPow on the sccpow port (#2997)
Core
- update DEVICECONTROL.md
- curl examples need -u user:pass when the rig runs with RemoteAPI and APIauth, also on localhost
- update ethdagsizes.json
- update install.sh
- update mrrpools.json
- update mrrpoolsall.json
- update mrrpoolsalt.json
- update NETWORKING.md
- update poolsinfo.json
- update WhatToMine.ps1
- lower entry bar for minerstat in WTM
- Add remote device control and benchmark seeding
- add the API commands /setdevices and /getdevices: a volatile runtime device override for home automation, never written to config.txt (Discord request)
- count=N keeps the first N GPUs of the configured selection, devicename= takes selectors, reset=1 returns to config.txt
- Core applies the override from $Session each round and ends the waiting phase via $API.SetDevices; new PauseStatus ByDevices when the selection is empty
- seed missing miner benchmarks from an already benchmarked device set of the same model, scaled per device and written like a fastlane value
- /getdeviceconfig reports the configured selection, so the Setup page cannot persist an override
- Doc/DEVICECONTROL.md with a Home Assistant example, API page and README entries
- Add per device group counts to /setdevices
- count=:,.. keeps n GPUs per device group (the Model of /getdevices, incl. gpugroups names, case-insensitive); groups not named keep all their GPUs
- plain count=N is unchanged; unknown groups are rejected with the list of valid ones, clamps are reported per group
- Doc/DEVICECONTROL.md and the API page describe the new form
- Fix miner stats reset after a miner update
- keep Duration as TimeSpan string when carrying stats over to a new miner version, a stat updated in the running session was written as "@{Ticks=..}" and reset on the next read
- Drop in-process NetSecurity, Defender and NetTCPIP imports
- the three CDXML modules cost ~37 MB of heap and nothing in the RainbowMiner process uses them anymore; the elevated firewall and Defender helpers import them in their own process
- auto port fallback uses netstat incl. TCPv6 instead of Get-NetTCPConnection, which would autoload NetTCPIP
- Store cached stats as typed objects
- miner and pool stats in StatsCache are RBMMinerStat/RBMPoolStat (RBMToolBox.cs) instead of PSCustomObject, ~400 bytes instead of ~4 KB per stat, one type per process for all runspaces
- IsFL is a real bool now, the version carry-over read a SwitchParameter back as true
- Fix seeded value in the fastlane reset message
- Repair stat files with a broken Duration instead of dropping them
- a field that does not convert keeps its default, the old PSCustomObject stats tolerated such files as well
- Duration written as "@{Ticks=...}" by older version carry-overs is restored from Ticks
- Seed benchmarks only from siblings of the current miner version
- the version check removed a seed copied from an older sibling in the same round, so it was seeded again every round
- Pass the API and asyncloader scripts as text
- AddScript parses the text per runspace anyway, the [ScriptBlock]::Create copy stayed alive in the script cache (~2.7 MB for API.ps1)
- Update config library
- seed ocprofiles Profile0 to Profile8 per model (Profile0 was never seeded)
- Update OC profile presets
- Nvidia presets for 47 models, incl. GTX16xx, RTX20 Super/Ti, RTX30/40/50
- new Profile8 (core +0) for FiroPow, ProgPowZ and the plain ProgPow variants
- map 39 more algorithms, fix Equihash, Qhash, DynexSolve, Autolykos2, Cuckatoo32
- remove dead EquihashR25x4x0/EquihashR25x5x0 keys
- Update overclocking doc
- default profiles, Linux memory offset scale, recommended clock locks
- Fix crash from miner output events in the runspace pool
- miner stdout/stderr are collected by plain .NET handlers (RBMOutputPump) instead of Register-ObjectEvent -Action subscriptions: an event arriving while the pooled runspace was idle made PowerShell pulse it from a thread-pool thread, and two colliding pulses killed the whole process (InvalidPipelineStateException, exit code 0xE0434352)
- the event subscriptions stay as fallback if the helper cannot be compiled
- Cap large logs in the /debug zip
- logs above 4 MB are reduced to their first 64 KB and last 2 MB before masking: a firominer reconnect loop on a dead pool wrote 60 MB in minutes, and masking the whole file made /debug take 13 minutes and ~60 MB extra memory while holding an API thread
- Cap the per-tick miner output drain
- DrainToLog takes at most 10000 lines per call: the C# pump enqueues at native speed, and a miner that floods faster than the loop dequeues kept it from returning to the watch loop
- the flush after the exit loops until the queue is empty (time-bounded), so a large tail is not truncated
- Update Linux overclocking
- apply lock-only OC profiles and reset locks on all models (#2743, #1801)
- run queued OC resets after miner stops and at exit
- pass DISPLAY/XAUTHORITY to the ocdaemon without headless mode, detect XAUTHORITY from the running Xorg (#1843, #991)
- fix LinuxDisplay without colon, log ocdaemon failures as warnings (#2595)
- address nvidia-settings GPUs by PCI bus and read the perf level from the card (#1934, #2775, #1990)
- new LinuxOCMethod: core/memory offsets through NVML without an X server (#2120)
- fix EnableOCLinuxForcePState in the setup wizard, power limit index and re-issue
- Update overclocking doc
- Linux troubleshooting, GPU map, LinuxOCMethod and NVML
- Update OC profile memory scale
- new profile field MemoryClockScale (windows/linux): Linux doubles Afterburner-scale memory offsets for nvidia-settings and NVML
- existing profiles get it empty and keep their behavior on every platform, the shipped presets are windows
- setup wizard step, /ocprofiles API and web column
- Update overclocking doc
- MemoryClockScale replaces the manual doubling on Linux
- Move KawPow family to OC Profile8
- KawPow, KawPow2g-5g, MeowPow, EvrProgPow and SCCPow default to Profile8 (core +0, memory max): the small core offset of Profile7 crashed Gminer's KawPow kernel on a GTX1070 rig
- Cleanup moves existing algorithms.config.txt entries from Profile7 to Profile8 on the update from v5.0.3.1, but only while every Profile7 in ocprofiles.config.txt is still a shipped preset (v5.0.3.1 table, current table or empty)
- Profile7 stays seeded as the core-slightly-up template, doc updated
- Add PhiHash to OC Profile8
- PhiHash had no algorithm default and ran on the device default profile (core up); it is a ProgPow derivative and joins Profile8 (core +0, memory max)
- Cleanup gives an empty PhiHash entry Profile8 on the update from v5.0.3.1, a profile set by hand stays
- Update Linux overclocking for Arch and other distros
- getxauth.sh also finds the cookie file of a plain X process (Arch, Fedora, sddm)
- install_pkg.sh installs python3 for the NVML helper (Arch: python)
- warn once when LinuxOCMethod=nvml/auto lacks python3 or the ocdaemon
- installer/debug GPU count matched PCI bus 3d and 3DNAND devices
- Update error logging and small fixes
- errors_*.main.txt shows the script position of each error
- Vipor: a pool without a found block dropped the coin (null DateTime)
- miner version stamp wrote into a missing stat (Duration error)
- Stats/Totals may not exist yet on a fresh install
- Fix xmrig thread config for aliased algorithms
- xmrig writes profile aliases as strings into threads_.json ("rx/arq": "rx/wow")
- the alias was taken for the thread list, so RandomArq, RandomXEQ and RandomVirel ran with one thread on CPU 0
- follow the alias to the real profile and rebuild config files written with a single thread
- Honor the process CPU set in the Linux CPU topology
- CPUs outside Cpus_allowed_list (LXC, Docker, systemd AllowedCPUs, taskset) are dropped from the topology
- cores, threads and the default affinity follow the usable CPUs instead of the host's
- Update CPU info and affinity docs
- getcpuinfo.sh sums the L3 slices of all CPUs (second socket, Ryzen CCDs) instead of cpu0's slice
- /cpuinfo Information block shows the topology's cores, threads and sockets
- per-miner Affinity without Threads used an undefined variable
- the abort on a broken config.txt names the file and points to the error above
- CONFIG.md: Linux numbers SMT siblings differently than Windows; EnableAutoAdjustAffinity default is 0
- Fix miner start with CPU affinity masks above 31 bits
- the -CPUAffinity parameters of Start-SubProcess and its helpers were [Int], so a mask like 0xffff0000 failed the parameter binding and the miner never started (Nanominer CPU)
- parameters are Int64 now, SetPriorities clamps masks beyond 63 bits to 0, the process setter casts to IntPtr
- Create a pool's first totals file without an exception
- Set-Total relied on the null-object exception to create a missing totals file, which left a Duration error line for every new pool
- Skip console key polling without a console
- KeyAvailable throws on every poll when stdin is redirected (systemd unit, nohup, docker), one error per round
- polling is skipped when input is redirected or the first check failed
- Update Linux installer and error logging
- install_pkg.sh installs libnuma (xlarig and other xmrig builds need it, Arch does not ship it)
- Get-PoolPortsFromRequest/Get-PoolDataFromRequest accept a failed request instead of raising a binding error
- errors_*.main.txt writes one line per distinct message and position per round, with a repeat count
- balance stats skip earnings entries without a date
- Pick xmrig CPU threads in topology order
- the even-first sort assumed Windows sibling numbering and paired SMT siblings on Linux when the mask had more bits than threads
- xmrig configs now select one thread per physical core first (RealCores, then ThreadList), unchanged result on Windows
- Replace the per-miner pwsh guard on Linux by a bash guard
- the tmux/screen start job stayed alive as a watchdog that stops the miner when RainbowMiner dies, one pwsh job host (about 170 MB) per running miner
- minerguard.sh takes over that watch (Ctrl-C into the session, start-stop-daemon, kill -9, kill the session); for miners started as root it is launched through the ocdaemon, so it shares the miner's cgroup and outlives a service manager stopping RainbowMiner
- the start job is removed right after the hand-over, a lightweight stand-in answers the job members MinerAPIs reads
- verified on WSL (no root) and on a rented box (root via ocdaemon, Ubuntu host and Arch container): clean stop unchanged, an orphaned miner is stopped within seconds of a SIGKILL of RainbowMiner
- Make minerguard.sh POSIX sh
- no bash substring expansion or local, #!/bin/sh, launched with sh
- clean stop and orphan kill re-tested under dash
- Keep expected miner API refusals out of the error log
- a miner refuses its API port until it is ready (a DAG build takes minutes): refused polls during the first five minutes of a miner are no longer written to errors_*.main.txt, later ones still are
- Write-ToFile writes UTF-8 without BOM, the leading BOM of every new log file tripped tools parsing the first line
- (linux) Trim the pwsh footprint on Linux from the start scripts
- MALLOC_ARENA_MAX=2: glibc kept about 500 MB of freed memory in per-thread malloc arenas on a 6 GPU rig (1481 -> 936 MB working set at one hour)
- DOTNET_EnableWriteXorExecute=0: the W^X double mapping of the JIT code cost 104 MB on a Raspberry Pi and slows the JIT
- values already present in the environment win
- start.sh runs inside a { ... } group like startwd.sh, so an update overwriting the file under a running loop cannot derail it
- Return freed native memory to the kernel on Linux
- glibc kept about 1 GB of freed memory in per-thread malloc arenas: 1.4-1.5 GB working set against 490 MB committed by the GC on a 6 GPU + CPU rig
- malloc_trim(0) once per round brings the working set to 800-870 MB at the same managed heap (Xeon, three unlimited runs as reference); a Raspberry Pi 4 holds 570 MB at one hour
- the mallopt arena limit stays as a no-op fallback; systems without glibc skip everything
- Create mrrpoolsalt.json
- Update core - Get-MiningRigRentalsPoolsData -Alt loads mrrpoolsalt.json, a missing file is not an error - add Get-MiningRigRentalsRigPool and Test-MiningRigRentalsOwnPool
- Update MiningRigRentals doc - mention the fallback benchmark and rig pool
- Update core - recognise Kryptex account users (name/mrx) as own MRR rig pools
- Update core - add EnableServerDiscovery (opt-in, default off): the server announces its api address to the local network with a HMAC-signed UDP beacon and the clients learn it - resolve a ServerName to its ipv4 addresses before probing, pwsh 7 tries the ipv6 addresses first and a stale one eats the whole timeout
- Get-ServerAddress (TcpLib) replaces every Test-TcpServer probe of ServerName: announced ip first, then the ipv4 addresses of the name, working ip goes into the urls, Data/serveraddr.json remembers the announced address
- Send-APIServerUdp signs "RBM2|machine|ip|port|ts" with the api password, one directed broadcast per interface; Start/Receive/Stop-APIBeacon on the client, polled once per round without threads
- client accepts only signed, fresh, non-replayed announcements whose sender is the announced ip and whose machine name matches ServerName
- refresh Session.MyIP every 5 minutes, Get-MyIP uses a udp route lookup before ipconfig/ip route
- config key in setup, web setup schema, InitClient/InitServer; Initialize-APIServer -ServerPort adds the udp rule for a differing server port
- Doc/NETWORKING.md, Doc/CONFIG.md, README
- Update core - send each server announcement from a socket bound to its interface, so the datagram's source is the announced ip on multi-homed servers as well and the clients follow the server's default-route interface
- Update core - add ServerSSL and ServerCertHash: a client talks https to a TLS proxy (e.g. Caddy) in front of the server's api port, the certificate must pass the normal validation or match the pinned fingerprint - rewrite the internet section of NETWORKING.md: VPN first, then the proxy step by step, no plain port forwarding (#1601)
- Get-ServerUrl (TcpLib) builds every server url and registers https hosts with RBMCertPin (DotNet/Tools/CertPin.cs): chain validation, or a SHA-256/SHA-1 fingerprint pin; unregistered hosts are accepted as before
- the callback is hooked into HttpClient on pwsh 7 and into ServicePointManager on Windows PowerShell 5.1; server calls with ServerSSL go through HttpClient, never through curl -k
- a changed ServerSSL/ServerCertHash restarts HttpClient and runspaces, pooled https connections keep their handshake
- the getjob relay falls back to the direct fetch when the server call throws instead of failing the job
- ServerSSL/ServerCertHash are never taken from the server's config, also with an old exclude list
- setup, InitClient, web setup, CONFIG.md, README
- Update core & downloader - pass the running miner paths to the downloader instead of letting it ask the local API - with APIauth the listener rejects the downloader's anonymous /runningminers call with 401, which logged "RainbowMiner API is down!" and let the downloader overwrite folders of running miners - Core appends a marker item with the running miner paths to the downloader arguments - the /runningminers request stays as fallback when the marker is missing
- server mode: forget clients not seen for 24h, offline clients stayed red in the Clients line until restart
- keep only the newest entry per client before printing, duplicates could be printed twice
- Add CopyGpuStats helper
- copy the single-device benchmark stats of one GPU to another, for when a card drops out and the GPU numbers shift
- multi-device stats stay untouched, replaced target files are moved to Stats\Miners-backup-
- CopyGpuStats.bat / copygpustats.sh wrappers, listed in the README
- Add miner stats backup and restore to the web interface
- Config > Minerstats Backup: create a backup zip of all miner stats in Stats\Backups, list, download, restore or delete it
- a restore saves the current stats as a "before restore" backup first and reloads the restored stats into the cache in place, no restart needed
- restore and delete are blocked by APIlockConfig, zip entries are checked before anything is touched
- new API endpoints /minerstatsbackups and /minerstatsbackup
- README: new section "Backing up and restoring benchmarks", incl. CopyGpuStats
Documentation
- How to Update: https://github.com/RainbowMiner/RainbowMiner/blob/master/Doc/UPDATE.md
- Main: https://github.com/RainbowMiner/RainbowMiner/blob/master/README.md
- Networking: https://github.com/RainbowMiner/RainbowMiner/blob/master/Doc/NETWORKING.md
- Linux-Setup Shortguide: https://github.com/RainbowMiner/RainbowMiner/blob/master/Doc/LINUX-SETUP-SHORTGUIDE.md
- Other: https://github.com/RainbowMiner/RainbowMiner/issues?q=is%3Aissue+label%3Adocumentation