Dual Pool Mining Proxy (DPMP)

Just in case any solo miners out there might be interested, I just released a product called DPMP (Dual Pool Mining Proxy) via the Umbrel Community App Store. The app store link is:

What is it For?

Recently, the NerdQAxe++ miners implemented a “dual-pool-mining” feature where you can set your miner to mine to two pools simultaneously (i.e., split your hashrate and mine, for example, to a BTC pool and a Bitcoin Cash pool at the same time). I wanted to do just that, but the miners I have (an Avalon Nano3S and a Avalon Q) do not have that feature. So I built my own proxy to do the job. In the DPMP proxy configuration you set up the two pools you want to mine to (i.e., enter URL/IP, Port, Wallet Address for both pools). You can also adjust the scheduling…by default it is 50/50 and will split work between the two pools. But you can set that to any ratio you like, such as 70/30 or 90/10…whatever you want.

Once DPMP is up and running and connected to the pools, you can attach your miners to DPMP. So in the miner config just set the Pool address to the IP of the box on which you are running DPMP. Set the Port to 3351, and set the wallet address as [wallet-address].[workername] That’s it…the miner will attach to DPMP, and DPMP will route work between the two pools you have defined.

Please note that the wallet address you input in the miner is NOT used by the DPMP proxy…only the workername is used. The DPMP proxy gets the correct wallet address to use for each pool from the DPMP Configuration file, and when it communicates with either pool it uses the correct wallet address for that pool. So, for example, if you are setting up DPMP to mine to a regular Bitcoin pool and to a Bitcoin Cash pool, in your miner config use either your Bitcoin wallet address or your Bitcoin Cash wallet address (does not matter which) and then append the workername to the end as shown above.

Once you get one or more miners attached, DPMP will start balancing work between the two pools to achieve the ratio you have defined in the DPMP configuration…basically just let it run for 1/2 hour and you should see the “Pool A/Pool B” ratio converge on the DPMP dashboard. And if you look at your pool dashboards you should see your miner(s) showing up, and with the correct hash rate. So, for example, with my Nano3S (~6TH/s) it shows up with around a 3TH/s hashrate on the BTC and BCHN pools I’m mining to, and that is correct since I have my ratio set to 50/50 (i.e., split the work evenly between the two pools).

You can access the DPMP dashboard at any time by clicking on the DPMP icon in Umbrel. It consists of 4 tabs:

Home - Displays the stats, the system paths, and provides a Restart button.

Config - Where you set up your pool configuration, scheduling, etc. There are several sections but primarily you will only need to edit the Pool A Settings and Pool B Settings sections to get DPMP up and running.

Logs - Displays DPMP log output.

About - The about page for DPMP with a detailed description and setup instructions.

I have attached some snapshots of the DPMP dashboard.




DPMP is free and distributed under the MIT license.

Enjoy,

Chris

1 Like

Version 2.0.0 released today:

2.0.0 — 2026-02-06

  • Fixed reject storms during pool switches.
  • Improved scheduler convergence and validation.
  • Increased grace period for stale submits.
  • Ensured correct single-pool behavior at 0/100 and 100/0 weights.
  • Added pool failover protection.
  • Added global exception handling.
  • Added periodic state pruning.
1 Like

So, I gave it a try and it appears that the Proxy does not like the NMAxeGamma and Braiins Mini Miner BMM101.

The BMM101 would do a few shares and then disconnect.

The NMAxeGamma would try to connect to the Proxy Pool Address and just keep rebooting. Here is the log for the NMAxeGamma:

{“ts”:“2026-02-07T05:31:08+00:00”,“event”:“pool_diff”,“pool”:“A”,“diff”:1024.0}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“configure_forwarded_both_pools”,“sid”:“(‘192.168.6.7’, 54843)”,“handshake”:“A”,“other”:“B”,“id”:3,“internal_id”:9000003}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“post_auth_push_extranonce”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”,“extranonce1”:“000002a9”,“extranonce2_size”:4}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“auth_result”,“pool”:“A”,“ok”:true,“error”:null}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“post_auth_downstream_sync”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“downstream_extranonce_check”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”,“handshake”:“A”,“last_en_pool”:null,“force_send”:false,“new_en1”:“000002a9”,“new_en2s”:4,“last_en1”:null,“last_en2s”:null}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“miner_ready_for_jobs”,“sid”:“(‘192.168.6.7’, 54843)”,“worker”:“Gamma1”,“handshake_pool”:“A”}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“authorize_rewrite_secondary”,“pool”:“B”,“worker”:“Gamma1”,“upstream_user”:“bc1qut0…53g4aax2.Gamma1”}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“authorize_rewrite_other”,“pool”:“B”,“worker”:“Gamma1”,“upstream_user”:“bc1qut0…53g4aax2.Gamma1”}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“authorize_rewrite”,“pool”:“A”,“worker”:“Gamma1”,“upstream_user”:“bc1qut0…53g4aax2.Gamma1”}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“subscribe_id_response_skipped_duplicate”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”,“id”:1}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“downstream_send_extranonce”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”,“extranonce1”:“000002a9”,“extranonce2_size”:4}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“subscribe_result”,“pool”:“A”,“extranonce1”:“000002a9”,“extranonce2_size”:4}
{“ts”:“2026-02-07T05:31:07+00:00”,“event”:“downstream_subscribe_forwarded_raw”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_bootstrap_auth_result”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“B”,“ok”:true,“error”:null}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_diff”,“pool”:“B”,“diff”:1024.0}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_diff”,“pool”:“B”,“diff”:1024.0}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_bootstrap_subscribe_result”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“B”,“extranonce1”:“85cb8669”,“extranonce2_size”:8}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_bootstrap_authorize_sent”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“B”,“id”:9000002,“user”:“bc1qut0…53g4aax2.dpmp_bootstrap”}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_bootstrap_subscribe_sent”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“B”,“id”:9000001}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_connected”,“key”:“B”,“pool”:“GoBrrPool”,“host”:“192.168.6.6”,“port”:21420}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_connecting”,“key”:“B”,“pool”:“GoBrrPool”,“host”:“192.168.6.6”,“port”:21420}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“bootstrap_skipped_handshake_pool”,“sid”:“(‘192.168.6.7’, 54843)”,“pool”:“A”,“handshake”:“A”}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_connected”,“key”:“A”,“pool”:“goPool”,“host”:“192.168.6.6”,“port”:23456}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“pool_connecting”,“key”:“A”,“pool”:“goPool”,“host”:“192.168.6.6”,“port”:23456}
{“ts”:“2026-02-07T05:31:02+00:00”,“event”:“miner_connected”,“peer”:“(‘192.168.6.7’, 54843)”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_diff”,“pool”:“A”,“diff”:1024.0}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“configure_forwarded_both_pools”,“sid”:“(‘192.168.6.7’, 51828)”,“handshake”:“A”,“other”:“B”,“id”:3,“internal_id”:9000003}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“post_auth_push_extranonce”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”,“extranonce1”:“000002a8”,“extranonce2_size”:4}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“auth_result”,“pool”:“A”,“ok”:true,“error”:null}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“post_auth_downstream_sync”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“downstream_extranonce_check”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”,“handshake”:“A”,“last_en_pool”:null,“force_send”:false,“new_en1”:“000002a8”,“new_en2s”:4,“last_en1”:null,“last_en2s”:null}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“miner_ready_for_jobs”,“sid”:“(‘192.168.6.7’, 51828)”,“worker”:“Gamma1”,“handshake_pool”:“A”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“authorize_rewrite_secondary”,“pool”:“B”,“worker”:“Gamma1”,“upstream_user”:“bc1qut0…53g4aax2.Gamma1”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“authorize_rewrite_other”,“pool”:“B”,“worker”:“Gamma1”,“upstream_user”:“bc1qut0…53g4aax2.Gamma1”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“authorize_rewrite”,“pool”:“A”,“worker”:“Gamma1”,“upstream_user”:“bc1qut0…53g4aax2.Gamma1”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“subscribe_id_response_skipped_duplicate”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”,“id”:1}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“downstream_send_extranonce”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”,“extranonce1”:“000002a8”,“extranonce2_size”:4}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“subscribe_result”,“pool”:“A”,“extranonce1”:“000002a8”,“extranonce2_size”:4}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“downstream_subscribe_forwarded_raw”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_auth_result”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“B”,“ok”:true,“error”:null}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_diff”,“pool”:“B”,“diff”:1024.0}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_diff”,“pool”:“B”,“diff”:1024.0}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_subscribe_result”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“B”,“extranonce1”:“84cb8669”,“extranonce2_size”:8}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_authorize_sent”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“B”,“id”:9000002,“user”:“bc1qut0…53g4aax2.dpmp_bootstrap”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_subscribe_sent”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“B”,“id”:9000001}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connected”,“key”:“B”,“pool”:“GoBrrPool”,“host”:“192.168.6.6”,“port”:21420}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connecting”,“key”:“B”,“pool”:“GoBrrPool”,“host”:“192.168.6.6”,“port”:21420}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“bootstrap_skipped_handshake_pool”,“sid”:“(‘192.168.6.7’, 51828)”,“pool”:“A”,“handshake”:“A”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connected”,“key”:“A”,“pool”:“goPool”,“host”:“192.168.6.6”,“port”:23456}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connecting”,“key”:“A”,“pool”:“goPool”,“host”:“192.168.6.6”,“port”:23456}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“miner_connected”,“peer”:“(‘192.168.6.7’, 51828)”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“miner_disconnected”,“peer”:“(‘192.168.6.7’, 51827)”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_auth_result”,“sid”:“(‘192.168.6.7’, 51827)”,“pool”:“B”,“ok”:true,“error”:null}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_diff”,“pool”:“B”,“diff”:1024.0}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_diff”,“pool”:“B”,“diff”:1024.0}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_subscribe_result”,“sid”:“(‘192.168.6.7’, 51827)”,“pool”:“B”,“extranonce1”:“83cb8669”,“extranonce2_size”:8}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_authorize_sent”,“sid”:“(‘192.168.6.7’, 51827)”,“pool”:“B”,“id”:9000002,“user”:“bc1qut0…53g4aax2.dpmp_bootstrap”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_bootstrap_subscribe_sent”,“sid”:“(‘192.168.6.7’, 51827)”,“pool”:“B”,“id”:9000001}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connected”,“key”:“B”,“pool”:“GoBrrPool”,“host”:“192.168.6.6”,“port”:21420}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connecting”,“key”:“B”,“pool”:“GoBrrPool”,“host”:“192.168.6.6”,“port”:21420}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“bootstrap_skipped_handshake_pool”,“sid”:“(‘192.168.6.7’, 51827)”,“pool”:“A”,“handshake”:“A”}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connected”,“key”:“A”,“pool”:“goPool”,“host”:“192.168.6.6”,“port”:23456}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“pool_connecting”,“key”:“A”,“pool”:“goPool”,“host”:“192.168.6.6”,“port”:23456}
{“ts”:“2026-02-07T05:30:40+00:00”,“event”:“miner_connected”,“peer”:“(‘192.168.6.7’, 51827)”}
{“ts”:“2026-02-07T05:30:16+00:00”,“event”:“dpmp_listening”,“addrs”:“(‘0.0.0.0’, 3351)”,“config”:“/data/config_v2.json”,“upstreamA”:“192.168.6.6:23456”,“upstreamB”:“192.168.6.6:21420”,“mode”:“dual_pool_scheduling_handshake_forward”,“weights”:“50:50”}
{“ts”:“2026-02-07T05:30:16+00:00”,“event”:“metrics_started”,“host”:“0.0.0.0”,“port”:9210}
{“ts”:“2026-02-07T05:30:16+00:00”,“event”:“config_loaded”,“config”:“/data/config_v2.json”,“listen_host”:“0.0.0.0”,“listen_port”:3351,“metrics_enabled”:true,“metrics_host”:“0.0.0.0”,“metrics_port”:9210}
{“ts”:“2026-02-07T05:30:16+00:00”,“event”:“weights_normalized”,“wA”:50,“wB”:50,“weights_raw”:“50:50”,“targetA”:0.5,“targetB”:0.5}
{“ts”:“2026-02-07T05:30:16+00:00”,“event”:“scheduler_config_validated”,“min_switch_seconds”:50,“slice_seconds”:30,“wA”:50,“wB”:50}

If you want a Discord to help develop this app … you can join mine and we can start a DPMP-Dev Channel in there. RodB2008.com

Thanks for feedback and the log! I actually have a BM101 and it is running on the proxy right now so not sure what is going on there. It’s actually less flaky while on the proxy than it is when directly attached to a pool (had problems with it since day one). My version on the BM is Version:
2025-11-21-0-eb658dcd-25.11-plus…let me know what yours is please.

Regarding the NerdAxe…yep, I see that it does not support the mining.set_extranonce extension OR client.reconnect (which we use on pool failover). For the client.reconnect issue we can simply do a tcp close instead which will accomplish the same thing. Will dig into the mining.set_extranonce issue as well.

1 Like

Ok … my BMM101 is at the same version. Tomorrow, I will give it a try again and capture logs for that one and I will also try connecting the Nano3s, which I have not tried yet.

What Pool’s are you using to connect to? For testing, I just picked two out of the eight I have installed.

Another question, does the Proxy pass the .WorkerName onto the real pool? I was thinking that is what it would do.

Version 2.0.1 released today:

2.0.1 - 2026-02-07

  • Fixed mining.set_extranonce and client.reconnect issues for NerdAxe Gamma
  • Fixed Braiins BM-101 initialization and handshake issues

Note: The Braiins BM101 tends to open secondary connections which we now attempt to handle more gracefully.

I’m currently testing to BTC (Public Pool) and BCH (MiningCore). So far, MiningCore seems to be the toughest to please.

Re the WorkerName…yes we pass that piece on to the pools but we completely ignore the wallet address that each miner passes. So you configure the actual wallet addresses to use in DPMP config, use any wallet address + workername in your miner setup and when DPMP talks to a pool it sends the wallet address defined for that pool in DPMP + the workername sent by the miner.

I have a Avalon Q and a Nano 3S. If you have any issues with the Nano, try setting it’s failover pools (i.e., Pool #2 and Pool #3) to dead addresses (192.0.2.1:3333 for example). The Avalon Q has been the easiest to work with right from the start.

Version 2.0.2 released today:

2.0.2 - 2026-02-09

  • Fixes for ck-type pools and bootstrap sequence
  • Add realtime hashrate allocation slider to GUI
  • Added download log w/redact option

1 Like

Version 3.0.0 released today:

3.0.0 - 2026-02-11

  • calculate realtime network hashrate for BTC and BCH (short-term and long-term)
  • add auto-balance options to config
  • add auto-balance logic to DPMP and dashboard

Auto-Balancing: if you enable the “Auto Balance” feature in the scheduler section on the Configuration tab, DPMP will automatically adjust the pool weighting ratio periodically based on the observed realtime network hashrate of the coin associated with each pool. The default pool ratio when in “Auto-Balance” mode is 50/50 and it adjusts from there. The goal of this feature is to send more hashrate to the pool where our hashrate has more “value”. So, for example, if BTC short-term network hashrate increases relative to its long-term hashrate while BCH hashrate decreases then DPMP will automatically adjust the weighting to send more hashrate to BCH and less to BTC.

Our “baseline” network hashrate calculation tracks closely with what you’d see on hashrate reporting sites (e.g., CoinWarz), while the short-term window deliberately captures block-to-block variance to detect transient hashrate shifts — the Auto-Balancer acts on the ratio between the two, not the raw numbers.

Some limitations do apply. Currently, we only support BTC and BCH pools.

So with Auto-Balance off, you get the slider to adjust the hashrate distribution yourself. With Auto-Balance on, DPMP automatically allocates hashrate between the two pools.

Also, we have a bare metal install at: GitHub - ckryza/dpmpv2

1 Like

Version 3.0.1 released today:

3.0.1 - 2026-02-14

  • can now switch between Slider and Auto-Balance with no restart required (added switch button)
  • Auto-Balance times now in local time
  • minor cosmetic updates

So you can now toggle between the two panels (slider and auto-balance) at will with no restart required. When you move to the slider it will begin allocating based on the currently-set ratios, and when you switch back to auto-balance panel it will begin allocating based on those ratios.

1 Like

How is it coming with DPMP connecting to MiningCore? I really hate the MiningCore WebUI App. In fact, it would be better if I didn’t even have to using it and that DPMP would connect to the Mining Nodes directly! :slight_smile:

MiningCore is fine…having no issues with the pool itself at this point. I’m currently running MiningCore on Pool A (BCH) and Bassin on Pool B (BTC) and it is working smoothly. The only issue right now is with my BM-101, which does not play well mining to two pools with different extranonce2_size. MiningCore uses 4 bytes while Bassin uses 8 bytes and the BM-101 does not like that, and there is no good fix that I can see (tried a few, nothing works well). Now, if you have two pools with the same en2_size then it is not an issue. Obviously I’m not too worried about the BM-101 (a 1TH/s miner)…normally I would not even run it through DPMP…I would just connect it directly to one pool or the other. But if this is a general Braiins OS issue then it will be a problem.

I am setting up a “Stats” tab, which will have detailed stats on both the attached miners and the pools…probably ready by end of week.

Ok, So, my BMM101 is dropping connected directly to MiningCore as well. I have 4 devices: BitAxe 601 Gamma, NMAxeGamma, Avalon Nano3s and then the Braiins Mini Miner 101. The BMM101 and the NMAxeGamma seem to give me the biggest troubles staying connected to any of my local Pools.

For MiningCore, I have BCH, BC2 and DGB Nodes. I gave up on RetroMikes BSV Node for the moment, it kept crashing trying to sync the Blockchain so, I am still syncing the Blockchain on my Dev Server with creating my own node.

I also have local Pools of: Bassin, Go Brrr Pool, goPool and Public Pool too.

It might be interesting to see how DPMP does mining to 2 different Pools directly in MiningCore then.

Again, I really don’t like the WebUI for MiningCore … of the biggest things that it is missing is it does not show Best Difficulty for each Minor … I know only the Network Difficulty matters but it is always nice to see how close you are getting!

I have my own Discord, would you like to join it and we can collaborate in a channel there: Discord

Definitely, if both pools are the same that would reduce a lot of the complexity. I just put up v3.0.2 today, and have one more big push to convert everything over to a fleet-management perspective (e.g., track all aspects of each individual worker/miner and allocate them where they fit best to meet the current allocation ratio). So will track hashrate, ‘health’, fleet contribution, pool compatibility, etc. and only move those miners that absolutely must be moved (and only time-slice those that absolutely must be time-sliced) on each new ratio change. Should make for much faster ratio convergence and higher overall stability. Once I get that done I will touch base on Discord. Thanks.

1 Like

Version 3.0.2 released today:

3.0.2 - 2026-02-17

  • add Stats tab with Worker and Pool tables
  • address pool/miner compatibility issues
  • fix: no slider or auto-balancer display on 0/100 or 100/0 config ratios
  • adjust hashrate allocation logic to better account for individual miner hashrate
  • ratio convergence is now faster
  • prep for transition to fleet management

A Stats tab has been added with worker and pool tables. You can sort on any column. A fleet table will be added as part of the next update. The “Best” (best share) column is persistent. So as long as worker name does not change, if worker goes offline and at a later date comes back online, it’s all-time Best share will be retained.

DPMP Landing Page: https://ckryza.github.io/dpmpv2/

So, it can only be and/or a BTC and BCH Node?

Short answer, yes…but only for the Auto-Balancer pane…Slider pane (i.e., you adjust the ratio) is always available. Reason: I need to make rpc calls to the nodes to get the info to calculate st and lt network hashrate. I have a BTC node an a BCH node so I’m using those and storing the data in a MySQL table on the web so DPMP can access it. I looked into public RPC node availability and there is not much available, especially if you are looking for DGB or BSV nodes. There are some pay-as-you-go options but given that DPMP is not likely to generate any income I don’t feel like shelling out $$ for RPC node access. At some point I may add a RetroMike DGB node to my local network but that’s as far as I’m likely to go. I would absolutely rather have a “public node” option available that does not depend on me or my local network but, again, I have not found anything yet.

FYI, the transition to a fleet-mode way of handling the miners is coming along nicely.


New Home tab.


Fleet stats table.

The idea is to keep as many miners static (assigned to either A or B) as possible and only switch one, maybe two miners, as needed to maintain the balance. Results in much faster ratio convergences and less stress on the miners. We also track miner “health” and those with issues will always be last on the list to switch. Should be available some time next week.

1 Like

Version 3.0.3 released today:

3.0.3 - 2026-02-26

  • finalize fleet implementation
  • add Fleet table to Stats tab
  • address pool/miner compatibility issues
  • cosmetic updates

A lot of changes and updates in this version, too many to list here.

Visit the DPMP landing page for more info: Dual Pool Mining Proxy (DPMP)

If you have visited the landing page before, do a hard-refresh once you get there to force the new images to display.

1 Like

Version 3.0.4 released today:

3.0.4 - 2026-02-28

  • pinned-miner disconnect exemption
  • fix switch-count logic for Fleet table
  • disable scheduler debug log (grows fast, so update your version!)
  • add 5m HR column to Pool table
  • add entrypoint crash log
  • modify logging options
1 Like

Version 3.0.5 released today:

3.0.5 - 2026-03-04

  • add on/off toggle in worker table
  • adjust pool switching logic
  • add config A/B swap button
  • fix possible blocking condition on startup

Visit the DPMP landing page for more info: Dual Pool Mining Proxy (DPMP)

1 Like