solo db-less bitcoin-only mining pool, meant for lan swarms
  • Go 96.4%
  • Shell 2.3%
  • JavaScript 0.7%
  • Dockerfile 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-16 13:14:56 -04:00
constants fix: reduce read buffer size and stop storing entire time.Times in client stats 2026-07-02 13:09:07 -04:00
contrib chore: dep update 2026-10-16 12:27:41 -04:00
imgs move images to subdir 2026-10-10 19:43:51 -04:00
mockdata tests: update share validation tests and re-fix bip-310 mask validation 2026-09-26 18:12:44 -04:00
.dockerignore api: rename authorityKey to authorityPubkey 2026-10-15 11:30:14 -04:00
.gitignore add profiles to gitignore 2026-10-11 17:35:24 -04:00
api.go api: rename authorityKey to authorityPubkey 2026-10-15 11:30:14 -04:00
config.go move [backend].wait_for_sync to [pogolo] 2026-10-15 23:09:28 -04:00
config_test.go i really need to figure out why this freezes 2025-12-18 16:36:53 -05:00
go.mod chore: dep update 2026-10-16 12:27:41 -04:00
go.sum chore: dep update 2026-10-16 12:27:41 -04:00
jobtemplate.go fix(sv2): fix standard share processing 2026-09-15 14:37:49 -04:00
jobtemplate_test.go store height as uint64 2026-07-17 10:04:58 -04:00
LICENSE rename license 2025-07-29 11:14:01 -04:00
logmessages.go optimization: streamline lowdiff log 2026-07-27 09:56:00 -04:00
main.go last log tweak 2026-10-15 22:49:44 -04:00
mockrecording_test.go add parsing to sv2 UAs 2026-10-11 19:00:44 -04:00
openapi.yaml api: rename authorityKey to authorityPubkey 2026-10-15 11:30:14 -04:00
README.MD oki das it 2026-10-16 10:02:34 -04:00
stratumclient.go quiccfix: . in workername only worked in addr.worker.name 2026-10-16 13:14:56 -04:00
stratumclient_test.go add config option to disable logging 2026-10-15 14:57:44 -04:00
util.go add config option to disable logging 2026-10-15 14:57:44 -04:00
util_test.go this commit got too big... adhd go brrr 2026-07-11 12:39:08 -04:00
zmq.go doc: document stratumclient.go 2026-07-09 23:46:56 -04:00

/pogolo - decentralize or die/

solo db-less bitcoin-only mining pool, meant for lan swarms, not the internet;
start it, point your miners to it, and watch the logs roll by
think of this as public-pool but minimal and for self-sovereign nerds
infinite thanks to btcd for bitcoin tooling and public-pool for reference
Get pogolo on umbrelOS

want a go pool you can run on the public internet? check out https://github.com/Distortions81/M45-Core-goPool!

cpuminer on regtest

features

  • set a default address to mine to, no more ctrl+c ctrl+v ctrl+v ctrl+v ctrl+v ctrl+v
  • stratum v1 and stratum v2 on the same port
  • colorful and detailed logs (respects NO_COLOR)
  • read-only api
  • zmq and btcd websocket support
  • high performance and low memory usage (119k shares/sec @ ~50 mib + 1kib/client)

implemented BIPs

  • 34
  • 41 (probably)
  • 54 (coinbase, relies on a compliant backend for the rest)
  • 310 (minus subscribe-extranonce)
  • 323

supported miners

  • *axe family (bitaxe, nerd*axe, etc)
  • cpuminer
  • antminers
  • braiins OS

supported backends

pogolo has no tls support.

  • JSON-RPC (no longpoll)
  • btcd websocket
  • ZMQ (hashblock topic)

unsupported

  • whatsminers (they dont mine on the provided jobs, if you have one please test and send logs)
  • luckyminers/other non-foss axe clones
  • multiple sv2 channels on one connection (for now)
  • group channels (for now)

api

the api is documented in openapi.yaml, and exposed at /openapi.yaml.

install

umbrel

get pogolo from the umbrel app store: https://apps.umbrel.com/app/pogolo
then point your miners to stratum+tcp://umbrel.local:5661 or stratum2+tcp://umbrel.local:5661

docker

image at https://hub.docker.com/r/0xf0xx0/pogolo

copy the pogolo.toml from contrib/pkgs/docker, configure it to your needs, then run

docker run -d -v "./pogolo.toml:/config/pogolo.toml" 0xf0xx0/pogolo:latest

docker compose exists but likely needs tweaks, its also under contrib/pkgs/docker

environment overrides

for easy config

POGOLO_HOST: # overrides [pogolo].host
POGOLO_BACKEND_HOST: # overrides [backend].host
POGOLO_BACKEND_RPCAUTH: # overrides [backend].rpcauth
POGOLO_BACKEND_ZMQHOST: # overrides [backend].zmq_host

go

go install git.0xf0xx0.eth.limo/0xf0xx0/pogolo@latest

then follow manual install/configure.

manual install

build

git clone https://git.0xf0xx0.eth.limo/0xf0xx0/pogolo.git
cd pogolo
go build -trimpath -ldflags="-s -w -buildid="
go install

configure

# create config dir
mkdir "$XDG_CONFIG_HOME/pogolo"

# write embedded default config (preferred)
pogolo --writedefaultconf "$XDG_CONFIG_HOME/pogolo/pogolo.toml"
# OR copy the example config
cp contrib/pogolo.example.toml "$XDG_CONFIG_HOME/pogolo/pogolo.toml"

# configure interface, backend, and auth
vim "$XDG_CONFIG_HOME/pogolo/pogolo.toml"

# run
pogolo

theres a systemd unit at contrib/init/pogolo.service for bare installs
it expects pogolo to be in the system PATH, a bitcoin group, and a config file at /etc/pogolo/pogolo.toml.

sudo cp contrib/init/pogolo.service /etc/systemd/system/
sudo mkdir -p /etc/pogolo
pogolo --writedefaultconf /etc/pogolo/pogolo.toml
sudo chmod -R 755 /etc/pogolo
sudo chown -R :bitcoin /etc/pogolo 
sudo systemctl enable --now pogolo

miner config

host: stratum[2]+tcp://<your lan ip>:5661
username: [your onchain address][.<worker name>]
password: [required if set in pogolo.toml]
suggested diff: [optional]

the onchain address is also optional if the pool has a default configured.
shares submitted between job changes are normal, the expected error rate is <=0.2%.

benchmarking

to reproduce shares/s result:
benchmark with https://github.com/eandersson/open-pool-benchmark

TODO