pool online — mining live

Mine VRSC, ZEPH and XMR with Bellga — a miner tuned for every processor.

Bellga is an XMRig fork with native VerusHash 2.2 (VRSC) and RandomX (ZEPH and XMR), optimized from PCs and servers all the way down to 32-bit ARM phones — and the pool for all three coins runs right next to it, on this same server. See the optimizations and supported processors →

reference hash — validated byte for byte
c7334ff9a200d778f4aacdfd4b06483f6b66da17bb7d74335782b715e40c4274
canonical CVerusHashV2 × ported implementation, same test buffer

Project status

Pieces already tested live against real pools and on real hardware, plus what is still in progress.

Algorithms
VerusHash 2.2 (VRSC) validated byte for byte on x86-64 and ARM; RandomX (ZEPH, XMR) from XMRig
validated
Stratum protocol
Dedicated client, shares accepted live
validated
Difficulty scale
Target derived directly from the pool's 32-byte target
validated
Mobile support
Termux and UserLAnd, ARM64 and 32-bit ARMv7, native build per microarchitecture (53 core profiles)
validated
Our own pool
verusd, zephyrd and monerod + miningcore running on this server, systemd, automatic restart
online
Coins on the pool
VRSC (port 3960, VerusHash), ZEPH (3961, RandomX) and XMR (3962, RandomX) online
VRSC · ZEPH · XMR

How to install

Step by step for the two supported platforms: x86-64 desktop/server and mobile via Termux or UserLAnd. Either way you end up with the same bellga executable — only the way it is compiled changes.

Linux x86-64 (desktop, server, VPS)

VerusHash needs AES-NI + PCLMUL + SSE4.1 — practically any general-purpose Intel/AMD CPU made after ~2011-2012. RandomX (ZEPH/XMR) runs on any x86-64.

01
Clone and build

The build uses CMake, just like the original XMRig — the VerusHash module is already enabled. The executable ends up in build/bellga.

git clone https://github.com/bellga/bellga-miner.git cd bellga-miner && mkdir build && cd build cmake .. make -j$(nproc)
02
Enable huge pages (2MB)

Cuts down memory page swapping while hashing — a real hashrate gain at no cost.

sudo sysctl -w vm.nr_hugepages=1280 # to keep it after a reboot: echo 'vm.nr_hugepages=1280' | sudo tee -a /etc/sysctl.conf # lets bellga lock memory without running as root: sudo setcap cap_ipc_lock=+ep ./bellga

How many huge pages you need depends on how many threads you run — 1280 pages (~2.5GB) covers most home setups; raise it if you have many cores.

03
Enable 1GB pages (optional, smaller gain for VerusHash)

Has to be reserved at kernel boot, through GRUB — unlike 2MB huge pages, it cannot be enabled at runtime.

sudo nano /etc/default/grub # add to GRUB_CMDLINE_LINUX_DEFAULT: default_hugepagesz=1G hugepagesz=1G hugepages=4 sudo update-grub && sudo reboot
Note: 1GB pages help RandomX (ZEPH/XMR) more than VerusHash — VerusHash works with a much smaller key table (~8.6KB), so the 1GB-page gain for VRSC specifically is small. It is more worthwhile if you also mine ZEPH/XMR on the same machine.

Mobile — Termux / UserLAnd (ARM64 and ARMv7)

Native build right on the device, no cross-compiling. It detects the CPU core on its own and picks the right optimization — see the processor list.

01
Download and run the build script

Works the same on Termux and UserLAnd — the script detects which one you are using. Already had the old xmrig-vrsc? Running the script again updates the same folder and leaves an xmrig shortcut pointing to bellga.

curl -fsSL https://raw.githubusercontent.com/bellga/bellga-miner/master/termux-build.sh -o termux-build.sh chmod +x termux-build.sh ./termux-build.sh
02
Huge pages on Android: root required

Without root, Android never gives write access to vm.nr_hugepages nor lets you lock memory out of paging — the miner works fine without it, just with slightly lower hashrate. To really enable it:

# inside a root session (su): echo 256 > /proc/sys/vm/nr_hugepages setcap cap_ipc_lock=+ep ./bellga

Rooting the device just for this is only worth it if the extra hashrate matters to you — it is optional, the miner runs without root too.

Note: 1GB pages are not realistic on Android/mobile — they depend on kernel support that practically no stock kernel (rooted or not) enables. This is essentially an x86-64 desktop/server feature.

Choosing your pool in config.json

config.json is not tied to this pool — you can point it at any pool, for any coin Bellga mines.

new
config.json builder
Pick a pool (ours or LuckPool, Vipor, HeroMiners, HashVault, SupportXMR, MoneroOcean, Nanopool, 2Miners, Flockpool), coin and region, and download the ready-made file.
Build my config.json →
01
The complete config.json, already set up

This is the full reference — every field the miner accepts, pre-filled with sensible values (including dashboard and automatic benchmark submission, exclusive to this fork). The example is for VRSC: replace YOUR_VRSC_ADDRESS.worker_name with your real address before using it. For ZEPH or XMR, change algo to rx/0, the port to 3961 (ZEPH) or 3962 (XMR), and use that coin's address — or let the builder do it for you.

{ "api": { "id": null, "worker-id": null }, "http": { "enabled": false, "host": "127.0.0.1", "port": 0, "access-token": null, "restricted": true }, "autosave": true, "background": false, "colors": true, "dashboard": false, "title": true, "randomx": { "init": -1, "init-avx2": 0, "mode": "auto", "1gb-pages": true, "rdmsr": true, "wrmsr": true, "cache_qos": false, "numa": true, "scratchpad_prefetch_mode": 1 }, "cpu": { "enabled": true, "huge-pages": true, "huge-pages-jit": true, "hw-aes": null, "priority": 5, "memory-pool": true, "yield": false, "max-threads-hint": 100, "asm": true, "argon2-impl": null, "cn/0": false, "cn-lite/0": false, "verushash2.2": [-1, -1, -1, -1] }, "opencl": { "enabled": false, "cache": true, "loader": null, "platform": "AMD", "adl": true, "cn/0": false, "cn-lite/0": false, "panthera": false }, "cuda": { "enabled": false, "loader": null, "nvml": true, "cn/0": false, "cn-lite/0": false, "panthera": false, "astrobwt": false }, "donate-level": 1, "donate-over-proxy": 1, "log-file": null, "pools": [ { "algo": "verushash2.2", "coin": null, "url": "pool.bellga.tech:3960", "user": "YOUR_VRSC_ADDRESS.worker_name", "pass": "x", "rig-id": null, "nicehash": false, "keepalive": false, "enabled": true, "tls": false, "tls-fingerprint": null, "daemon": false, "socks5": null, "self-select": null, "submit-to-origin": false } ], "print-time": 60, "health-print-time": 60, "dmi": true, "retries": 5, "retry-pause": 5, "syslog": false, "tls": { "enabled": false, "protocols": null, "cert": null, "cert_key": null, "ciphers": null, "ciphersuites": null, "dhparam": null }, "dns": { "ip_version": 0, "ttl": 30 }, "user-agent": null, "verbose": 0, "watch": true, "rebench-algo": false, "bench-algo-time": 20, "pause-on-battery": false, "pause-on-active": false, "submit-benchmark": false, "submit-benchmark-duration": 90, "submit-benchmark-host": "bellga.tech", "submit-benchmark-port": 443, "submit-benchmark-path": "/api/benchmarks/submit", "submit-benchmark-tls": true, "user-token": "", "user-machine-id": "", "user-report-interval": 60, "user-report-host": "bellga.tech", "user-report-port": 443, "user-report-path": "/api/accounts/miners/heartbeat", "user-report-tls": true }

Same as above, with algo-perf pre-filled to skip the automatic calibration — on this build (32-bit, no hardware AES-NI/crypto extension) it crashes the miner with Bus error during the argon2/chukwav2 test, unrelated to VerusHash itself. Since rebench-algo stays false, the values here are just placeholders to satisfy the check — they do not need to be real hashrates.

{ "api": { "id": null, "worker-id": null }, "http": { "enabled": false, "host": "127.0.0.1", "port": 0, "access-token": null, "restricted": true }, "autosave": true, "background": false, "colors": true, "dashboard": false, "title": true, "algo-perf": { "cn/r": 100, "cn-lite/1": 100, "cn-pico": 100, "cn/ccx": 100, "cn/gpu": 100, "argon2/chukwav2": 100, "kawpow": 100, "ghostrider": 100, "flex/kcn": 100, "cn-heavy/xhv": 100, "rx/0": 100, "rx/graft": 100, "rx/arq": 100, "panthera": 100 }, "randomx": { "init": -1, "init-avx2": 0, "mode": "auto", "1gb-pages": true, "rdmsr": true, "wrmsr": true, "cache_qos": false, "numa": true, "scratchpad_prefetch_mode": 1 }, "cpu": { "enabled": true, "huge-pages": true, "huge-pages-jit": true, "hw-aes": null, "priority": 5, "memory-pool": true, "yield": false, "max-threads-hint": 100, "asm": true, "argon2-impl": null, "cn/0": false, "cn-lite/0": false, "verushash2.2": [-1, -1, -1, -1] }, "opencl": { "enabled": false, "cache": true, "loader": null, "platform": "AMD", "adl": true, "cn/0": false, "cn-lite/0": false, "panthera": false }, "cuda": { "enabled": false, "loader": null, "nvml": true, "cn/0": false, "cn-lite/0": false, "panthera": false, "astrobwt": false }, "donate-level": 1, "donate-over-proxy": 1, "log-file": null, "pools": [ { "algo": "verushash2.2", "coin": null, "url": "pool.bellga.tech:3960", "user": "YOUR_VRSC_ADDRESS.worker_name", "pass": "x", "rig-id": null, "nicehash": false, "keepalive": false, "enabled": true, "tls": false, "tls-fingerprint": null, "daemon": false, "socks5": null, "self-select": null, "submit-to-origin": false } ], "print-time": 60, "health-print-time": 60, "dmi": true, "retries": 5, "retry-pause": 5, "syslog": false, "tls": { "enabled": false, "protocols": null, "cert": null, "cert_key": null, "ciphers": null, "ciphersuites": null, "dhparam": null }, "dns": { "ip_version": 0, "ttl": 30 }, "user-agent": null, "verbose": 0, "watch": true, "rebench-algo": false, "bench-algo-time": 20, "pause-on-battery": false, "pause-on-active": false, "submit-benchmark": false, "submit-benchmark-duration": 90, "submit-benchmark-host": "bellga.tech", "submit-benchmark-port": 443, "submit-benchmark-path": "/api/benchmarks/submit", "submit-benchmark-tls": true, "user-token": "", "user-machine-id": "", "user-report-interval": 60, "user-report-host": "bellga.tech", "user-report-port": 443, "user-report-path": "/api/accounts/miners/heartbeat", "user-report-tls": true }
02
Switch pools whenever you want

url is the pool's host:port — switch freely between ours and any other (the builder already knows the addresses and ports of the main ones). user is always your address for the coin (VRSC, ZEPH or XMR) followed by . and a worker name of your choice, to tell each machine apart in the pool stats.

03
Fields exclusive to this fork

They do not exist in the original XMRig — only in Bellga:

FieldDefaultWhat it does
dashboardtrueFixed, redrawn panel (hashrate 10s/30s/60s/avg, latest jobs/shares) instead of the scrolling log.
submit-benchmarkfalseTurns on automatic benchmark submission — measures 90s of real mining, submits, then turns itself off.
submit-benchmark-duration90Seconds of measurement before submitting.
submit-benchmark-hostbellga.techWhere it submits to.
submit-benchmark-port443Port of the host above.
submit-benchmark-path/api/benchmarks/submitPath of the submit route.
submit-benchmark-tlstrueUses HTTPS to submit.
user-token""Secret token of your account (in my account) — links this miner to your public profile. Empty = off.
user-machine-id""Generated and saved automatically the first time — no need to fill it in.
user-report-interval60Seconds between heartbeats while mining.
04
Standard XMRig field groups

api/http: optional local HTTP API of the miner itself (not the pool API) — off by default.

autosave: if true, changes made through the API are saved back to config.json automatically — that is the mechanism submit-benchmark uses to turn itself off after submitting.

randomx: RandomX settings (ZEPH/XMR) — 1gb-pages: false by default, numa: true (important on multi-socket CPUs).

cpu: huge-pages: true, asm: true (assembly optimizations auto-detected for your CPU).

Maximum performance: the array "verushash2.2": [-1, -1, -1, -1] is already set to 4 threads (adjust the number of -1 entries to how many cores/threads you want to dedicate — nproc on Linux shows the total). yield: false and priority: 5 make the miner fight for CPU without yielding to the rest of the system — a real hashrate gain, but the machine gets less responsive for anything else running on it. For an extra gain, replace each -1 with the number of the physical core you want to pin it to (e.g. [0, 1, 2, 3]) — this stops the OS from moving the thread between cores.

opencl/cuda: GPU mining — off, Bellga is CPU-focused (VerusHash does not run on GPU in this port).

donate-level: % of time donated to the project (separate from the pool fee) — 1 is the minimum. When mining VRSC, ZEPH or XMR, the donation goes to pool.bellga.tech in the same coin.

pools: list of pools, with automatic failover if the first one goes down.

watch: reloads config.json automatically if the file changes on disk, no restart needed.

rebench-algo/bench-algo-time: automatic profit-based algorithm switching (MoneroOcean) — off on purpose, irrelevant for VerusHash.

pause-on-battery/pause-on-active: pauses mining on battery or while the user is active — relevant on a personal laptop/desktop, not on a VPS.

How payouts work

Same scheme for all three coins, the same one most pools use today — nothing exotic, so you know what to expect.

Scheme
PPLNS (Pay Per Last N Shares) — rewards split across the last shares submitted before each block is found, not per individual block
factor 2.0
Pool fee
Taken from what the network pays per block before it is split among miners
1%
Minimum payout
Balances below this keep accumulating, never expire, until they reach the minimum
1 VRSC · 1 ZEPH · 0.002 XMR
Frequency
The pool checks balances and processes payouts automatically
every 10min

Follow your pending balance, past payouts and live hashrate on the stats page — sign in and save your addresses (VRSC, ZEPH or XMR) there to keep track.

connect now
host pool.bellga.tech
VRSC port 3960 · verushash2.2
ZEPH port 3961 · rx/0
XMR port 3962 · rx/0
user YOUR_ADDRESS.worker

No account needed — the "user" in config.json is your own address (VRSC, ZEPH or XMR, depending on the port) followed by a worker name of your choice. Payouts go straight to that address. Or use the config.json builder.