Public Pool: solo mine against your own Bitcoin node
A self-hosted solo pool lets a Bitaxe build on blocks your own node checked, with no pool operator in the middle.
Public Pool is a GPL-3.0 stratum mining server that you run next to your own Bitcoin node, so your Bitaxe works on block templates from your node and any reward goes straight to the Bitcoin address you enter as the username. It is a one-click app on umbrelOS and StartOS, and it charges no fee at Bitaxe speeds. The catch is the odds: a 1.2 TH/s Bitaxe Gamma would find a block about once every 16,800 years at November 2026 difficulty, so this is a lottery ticket and a way to learn how mining works, not income.
Why run your own solo pool
A miner cannot talk to a Bitcoin node directly. As solo.ckpool.org puts it, you cannot mine directly to a Bitcoin Core node, so something has to speak the stratum protocol between them. Public Pool is that something. Its README describes it as a NestJS and TypeScript Bitcoin stratum mining server, and the project is licensed under GPL-3.0.
Public Pool asks your node for a block template with getblocktemplate and, if a miner solves one, hands the block back to your node with submitblock. That is the reason a bitcoiner would bother: the transactions in your miner's block come from your node's rules, a hosted pool never sees your miner, and nobody takes a cut. On Umbrel, the app page says a found block pays the whole reward, with no splitting and no fees.
The fee point has one footnote. The upstream code can send a 1.5% developer fee to a configured address, but only if that address is set, and it skips the fee for a miner measured at under 50 TH/s. A Bitaxe is far under that line, and the StartOS package pins the fee address empty, so all of it pays the miner.
If you do not run a node, solo.ckpool.org is the hosted option: it charges a 2% fee and runs the node for you. See my Bitaxe setup guide for how it compares.
The honest odds
Mining odds are plain division, so you can check them yourself. On November 5, 2026, mempool.space reported network hashrate of about 1,010 EH/s and difficulty of 148.36 trillion. The expected time for a miner to find a block solo is difficulty times 2^32, divided by the miner's hashrate in hashes per second.
For a Bitaxe Gamma at about 1.2 TH/s (the Bitaxe guide explains where that figure comes from), that works out to roughly 16,800 years. The table scales the same math to bigger setups.
| Your hashrate | Average time to find a block | Chance in one year |
|---|---|---|
| 1.2 TH/s (one Bitaxe Gamma) | About 16,800 years | About 0.006% |
| 10 TH/s (about eight Gammas) | About 2,000 years | About 0.05% |
| 100 TH/s | About 200 years | About 0.5% |
| 1 PH/s | About 20 years | About 5% |
Those are averages, and luck has no memory. A Gamma has the same chance on its first hash as on its billionth, and a win could come tomorrow or never. A block pays 3.125 BTC in subsidy plus fees, as block 974,686 on mempool.space shows. I would never count on one. Budget the power for a Bitaxe as a hobby cost, which the Bitaxe guide prices at roughly $29 a year at US average rates.
Running your own pool does not change these odds at all. It changes who builds your block and who could take a cut, not how often you win.
What you need
- A fully synced Bitcoin Core node. Public Pool reads work from it, so a node still catching up has nothing current to hand your miner. My node guide covers building one.
- The Public Pool app on the same machine as your node, or on your network if you use Docker.
- ZMQ block notifications turned on in Bitcoin. The StartOS package says that without ZMQ the pool never learns a block was found.
- Your own receive address from a wallet you control. Your Bitcoin address as the username is how Public Pool identifies a miner and where a found block pays, on StartOS. A hardware wallet address is the right choice.
- A Bitaxe or other stratum miner on the same local network. See the Bitaxe setup guide if you do not have one running yet.
One-click installs on umbrelOS and StartOS
If you already run a node on one of these systems, this is the easy path. My Start9 vs Umbrel comparison covers which one to pick.
- 1On umbrelOS, install Public Pool from the app store. As of November 2026 it needs umbrelOS 0.5 or later, and it is configured automatically to work with your Bitcoin node, so there is no extra setup. The app shows the stratum details to give your miner.
- 2On StartOS, install Bitcoin first, then Public Pool, and accept the task it raises to enable ZMQ on Bitcoin. For the current steps, follow the package's instructions.
- 3On StartOS, set the pool identifier. The package says it goes into every coinbase transaction and is public on-chain if you find a block, so do not put anything private in it.
- 4Open the Public Pool web interface and note the stratum address it shows. That is what you enter in the miner.
On plain Linux, the repository supports Docker. For the current commands, follow the README's Docker Compose section, which by default listens only on the local machine, so a miner on another computer cannot reach it until you change that. I would use the app on a node box before building this by hand.
Point a Bitaxe at your pool
AxeOS keeps its pool settings in the web dashboard, and ESP-Miner's API definition lists the same fields: stratum URL, port, user, and password, plus a matching set for a fallback pool. Menus can shift between versions.
- 1Open AxeOS in a browser at your Bitaxe's IP address, then go to the pool settings.
- 2Set the stratum URL to your node's address and the port your pool app shows. On StartOS, the instructions say ESP32 miners like the Bitaxe generally resolve the .local hostname; if yours cannot, use the node's LAN IP address instead. Do not use the .onion address, because mining firmware cannot resolve Tor.
- 3Set the user to your own Bitcoin address. The StartOS package says nothing on the pool side needs a credential, so the password field can stay at whatever the Bitaxe suggests.
- 4Save, then restart the Bitaxe. AxeOS warns that you must restart after saving pool settings for the changes to take effect. Once it is back, the worker should appear in the Public Pool web interface with a hashrate.
- 5Set a fallback pool. If your node is down or still syncing, the Bitaxe would otherwise sit idle. I would pick solo.ckpool.org as the fallback, with your same Bitcoin address as the username, accepting its 2% fee on a found block as the price of staying online.
StartOS also offers TLS, but its certificate comes from your device's own StartOS root CA, many ASIC firmwares skip certificate checks or do not support TLS stratum at all, and the package notes that plain TCP always works. On a home network, plain stratum is the simple choice.
Risks and limits
- Keep the stratum port on your home network. Opening it to the internet lets strangers point miners at your node. The Docker setup listens only on the local machine by default, so widen it only on purpose.
- If the node stops, the pool stops. The StartOS package notes that a green stratum check only means the port is open: miners failing to get work points at Bitcoin, unsynced or without ZMQ.
- The pool identifier you set ends up in the block you mine, so it is public if you win.
Frequently asked questions
What is Public Pool?
An open-source solo mining pool server you run yourself. It connects to your own Bitcoin node, gives your miners block templates, and pays any found block to the Bitcoin address you use as the username. It is available as an app on umbrelOS and StartOS.
Can I solo mine with a Bitaxe?
Yes, but a single 1.2 TH/s Bitaxe Gamma would find a block about once in 16,800 years at November 2026 difficulty, a chance of about 0.006% a year. Treat it as a lottery ticket.
Does Public Pool charge a fee?
Not for a Bitaxe. The upstream code applies its optional 1.5% developer fee only if a fee address is set, and skips it for miners measured under 50 TH/s. The Umbrel app page says no fees, and the StartOS package pins the fee address empty.
Do I need my own Bitcoin node to use Public Pool?
Yes. Public Pool gets block templates from Bitcoin Core over RPC and submits blocks back to it, so it needs a synced node. If you do not run one, solo.ckpool.org is the hosted option at a 2% fee.
What stratum port does Public Pool use?
The pool app shows the stratum address and port to enter in your miner. Plain stratum is the simple choice on a home network. StartOS also offers TLS, though many miners only support plain stratum.
What username do I use in AxeOS for Public Pool?
Your own Bitcoin address. That is how the pool identifies your miner and where a found block pays. Add a worker name after it only if the pool's interface says so.