Repository navigation
Pithead 2.0.0
Released 2026-10-13.
Pithead 2.0.0 is the first release of Pithead OS, the appliance: a bootable image that installs itself on a machine you dedicate to it, is set up from a browser, and updates as one signed image that goes back to the previous version on its own when an update does not boot. The Docker Compose install (DIY) ships in the same release, with the same stack, dashboard and configuration. Everything below applies to both unless it says otherwise.
Upgrading a 1.20.x install? Read Upgrading from 1.20.x first. The Tari 6.0 hard fork needs a one-way database migration.
Full details are in CHANGELOG.md. The appliance guide is docs/appliance.md.
Highlights
Pithead OS, the appliance (new)
- Write the image to a USB stick and boot from it. It installs itself and serves a one-page setup wizard to your browser. You pick a coordinator, a coordinator that also mines with its own CPU, or a mining rig. A machine with no monitor can be set up, and changed later, from a file on the stick.
- Updates use two system copies. The update is written to the idle copy and verified against the release key before install. If the new version does not come up, the machine returns to the previous copy by itself. Update from the dashboard's System update control or with
pithead os-update. Chain services start only after the new copy has committed, so a one-way database migration never runs on a version that might roll back. - Encrypted backups, with restore from the setup wizard on a fresh machine. A restored machine keeps its own identity.
- A config reset (keeps the synced chains, the wallet and the Tor keys) and a factory reset. A data partition damaged by a power cut is repaired, not erased.
- Host tuning built in: hugepages sized to the installed RAM, the performance CPU governor, a hardware watchdog, and the Tor-only egress firewall with IPv6 failing closed.
Tari and P2Pool
- Tari v6.0.1-pre.0 and P2Pool 4.18.1, upgraded together for the Tari 6.0 hard fork at block 350,000. Installs older than 2.0.0 are off the canonical Tari chain until they upgrade.
- A node that followed the dead 5.3.1 branch past 350,000 is rewound on its own (logged in
docker logs tarias[pithead fork-check]). - Monero keeps mining while Tari syncs after you turn it on or re-point it. With Tari optional, it also keeps mining through a Tari outage.
New installs, dashboard and CLI
- New installs start from safer defaults: Tari off unless you say yes (beta), the XvB raffle off, a dashboard login generated and shown once, the first sync over Tor, and the stratum password opt-in. Upgrades keep their configuration.
- Service Diagnostics shows the doctor's detail and a redacted log tail per service, with no shell needed.
- The XMR Network card shows whether monerod is at the tip with peers, and alerts when it is not.
- The onion client key can be revealed from the dashboard (Show client key), so a Tor-authorized onion works on the appliance.
- The dashboard shows where each rig's running configuration came from, and flags a rig running something other than what was applied.
- Tor: a saturated circuit history is detected and alerted, and
./pithead tor-recovercan reset it while Monero stays synchronized. Withtor.auto_healand dashboard control on, the gated recovery runs by itself. - Configuration: a disruptive change asks you to type
APPLY. A payout change also asks for the last characters of the new address. Neither depends on Telegram any more. pithead doctor --jsonandpithead support-bundle(redacted for support requests).
Security
- DIY: the Tor-only egress firewall and the LAN-only source rule are restored at boot before Docker starts any container.
- The dashboard warns and sends an alert when the Tor-only egress firewall is missing.
monero.rpc_lan_access,monero.zmq_lan_accessandtari.grpc_lan_accessaccept connections only from loopback, private and CGNAT addresses.- The Tari node no longer runs its own in-process Tor. It dials through the stack's Tor.
- The dashboard password stays out of process arguments, and its hash stays out of the appliance journal.
Removed
- Release images no longer accept
ssh.*options. A carried 1.xssh.enabled: trueis ignored and reported. - Telegram is a read-only notification channel.
/restart,/applyand the approval tap are gone, andapplyremovestelegram.controlfrom your config for you. - The 1.x aliases
dashboard.workers[]andxmrig_proxy.*are migrated once, in place, toworkers.list[]andxvb.*.
Also fixed in this release
These fixes are in the v2.0.0 tag. The tagged CHANGELOG lists them under Unreleased.
pithead applyfinishes a Caddy restart that an earlier, interrupted apply left pending, so the dashboard login always matches the config (#3332).- On the appliance,
pithead restoreafterpithead config-resetno longer refuses with "could not verify that the stack is stopped" (#3346). - A fleet
workers.api_portoutside 1-65535, or not an integer, is refused at preview and bypithead apply(#3358). - A Configuration preview made before the live config changed is rejected at commit, so a stale preview in another tab cannot overwrite a newer edit (#3352).
- A one-field save in Configuration no longer adds untouched default arrays to a minimal
config.json(#3355).
Upgrading from 1.20.x
Upgrading from 1.x is best-effort. A fresh setup may be required.
- Take
./pithead backup --with-chainsbefore upgrading. - Leave free space for the Tari migration. The old and new database copies sit on the data volume together at the peak.
./pithead upgradeneeds the currentdata.mdbsize plus 5 GiB free, and refuses before touching any container otherwise. - Tari reads "loading" for about 2.5 hours during its first-start migration. Do not stop, restart or
applythe stack until it finishes. Follow its phases withdocker logs tari. - If
tari.modeisremote, upgrade the serving node to v6.0.1-pre.0 before this stack. - The Tari node and wallet database migrations are one-way. There is no way back to 1.x Tari.
- The first time 2.0.0 reads a 1.x configuration, it migrates the old aliases once. The next
applydropstelegram.control, and a carriedssh.*setting is ignored and reported.
Beta in 2.0.0
Beta means the feature is optional and off unless you turn it on, and a defect seen only with it enabled may ship as a known issue. Dashboard beta badges come in 2.0.1.
- Tari merge-mining: off by default in the setup wizards. Upgrades and configs that omit
tari.modekeep the bundled node. A yes in a new-install wizard also setsdashboard.tari_required: false(#3333). - XvB raffle: off for new installs.
- Payout confirmation (
monero.view_key,tari.view_key). With Tari payout confirmation on, someone who knows your Tari address can make the view-only wallet show a fake incoming amount. It cannot spend (GHSA-g2r4-jvjg-h942). - Remote rig control: an appliance rig listens for control pinned to its coordinator and gated by its token. Dashboard writes to a rig need adoption first. On rigs whose home directories are mode
0750(the stock Ubuntu default), dashboard adoption and control do not work. Mining is unaffected (rigforge#362).
Known issues in 2.0.0
Appliance
- The built-in miner can stay at 0 H/s after a dashboard backup or a recovery boot. Run
sudo systemctl restart xmrigor reboot. Fixed in 2.0.1 (#3375). - After a dashboard update, the appliance can mint a new self-signed certificate for the same addresses, so the browser asks you to trust it again. Fixed in 2.0.1 (#3414).
- New: after an update from System update, reopening System update in the same tab can still offer the version you just installed, with Download. Reload the page before using System update again. Fixed in 2.0.1. During an update the page runs the code of the release you are updating from, so the fix applies to updates started from 2.0.1 onward: reload after the 2.0.0 to 2.0.1 update too (#3430).
- A restore started from the command line while the setup page is still starting can leave the setup page up instead of the dashboard. Mining is unaffected. Fixed in 2.0.1 (#3390).
- On an appliance rig, a pool changed from Worker Inspect reverts at the next reboot, because the rig's
rig.jsonowns the pool. Change it inrig.jsoninstead. The other Worker Inspect edits survive a reboot (rigforge#583).
Tor
- Tor auto-heal needs dashboard control. Without
dashboard.control.enabled, which includes every appliance set up with No login,tor.auto_healonly detects and logs Tor trouble. Turn dashboard control on, or restart Tor with./pithead restart tor(#3166). - Automatic Tor recovery restarts Tor on its own, and its long-run behaviour has had little soak time.
Dashboard and Configuration
- New: after a command-line restore over an existing install (
down,restore,up), the dashboard keeps serving the pre-restore configuration, including in the earnings calculator. The first save from Configuration can then re-propose the old values and undo part of the restore. Run./pithead applyonce, then./pithead restart. A restore from the setup wizard is not affected. Fixed in 2.0.1 (#3432). - Updated: a saved
workers.api_port: nullmeans the default port, 8080, but the preview shows it as "unset". It also stops the dashboard from attaching worker API read tokens for workers that use the fleet port, so their authenticated worker API reads fail. Omitworkers.api_port, or set it to8080. Fixed in 2.0.1 (#3377). - Setting the stratum port in Configuration to a port another service already uses is not caught by the preview. Apply then fails part-way with the proxy stopped. Configuration's recovery restores it (#3417).
- After a rejected stale Configuration change, the message can say it was saved (#3376).
- The preview can warn about a sidechain/PPLNS reset for a routing-only change (#3382), or about Tari sync settings that are off (#3383).
- The dashboard can show a LAN stratum URL for a loopback-only listener (#3384).
- An Advanced JSON edit that slips in a null webhook entry saves it without the preview listing it. Nothing is sent. Fixed in 2.0.1 (#3388).
- Dark mode can make text in dialogs (#3378), password placeholders (#3379) and the empty Workers Alive card's guide link (#3380) hard to read. The Advanced topology heading can be clipped (#3381).
DIY (Docker Compose)
- New: the dashboard's HTTPS certificate comes from Caddy's internal CA, which issues 12-hour certificates and renews them before they expire. If you accepted the certificate itself in the browser, the warning comes back after each renewal. Trust Caddy's local root CA once instead:
docker cp caddy:/data/caddy/pki/authorities/local/root.crt caddy-local-root.crtcopies it out (usesudoif your user cannot run Docker); add it to your system or browser trust store. Fixed in 2.0.1 (#3435). - On a host whose GRUB configuration has malformed quoting, later
update-grubruns can fail. Run setup with--skip-optimize, or remove/etc/default/grub.d/zz-pithead-hugepages.cfg(#3305). - The order of the DIY firewall rules against Docker at reboot is untested (#2677).
- DIY shows the appliance-only built-in-miner toggle (#3357).
- Recovery after an interrupted image build during DIY source setup is undocumented (#3348).
RigForge
- New: RigForge 1.18.0 does not apply the
threadssetting or its tuned thread count. XMRig 6.26.0 ignores the value as RigForge writes it and runs its own automatic, cache-sized profile instead, which can use every core. Athreadscap cannot keep cores free in this release; leavethreadsempty. The appliance's built-in miner sets no cap and is unaffected. Fixed in a RigForge patch release that Pithead 2.0.1 pins (rigforge#588).
Components
- Pithead
v2.0.0, commitc59e5ad6fc7c1fe82eb7558a2f962c18c1266299. - Mining-rig role: RigForge 1.18.0, commit
b2d4c3d9ca1da74d0e6d5ccce772d401acc8be03. - Tari node and console wallet
v6.0.1-pre.0-mainnet(pinned by digest) and P2Pool 4.18.1. Every component version and image digest is iningredients-v2.0.0.md.
Verify your download
SHA-256:
pithead-os-v2.0.0.img.xz:7958223c077bcaf4a4673e492471c763e564199fdb9663f4aa12504ac3573f63pithead-os-v2.0.0.raucb:58e690e73bb5224fdfe64ee39f814161d26d10f54e9f60d55bb03cdca58ea0b6pithead.tar.gz:761600817639dae92ebcffed2aae2e166d9bad70b9ff7afca4722408af42dcca
Appliance image (pithead-os-v2.0.0.img.xz): download it with pithead-os-v2.0.0.img.xz.sha256 into the same folder, then run sha256sum -c pithead-os-v2.0.0.img.xz.sha256 (macOS: shasum -a 256 -c pithead-os-v2.0.0.img.xz.sha256). A good download prints OK.
Appliance update bundle (pithead-os-v2.0.0.raucb): check it the same way with pithead-os-v2.0.0.raucb.sha256. The appliance also verifies the bundle's signature before it installs anything.
DIY install bundle (pithead.tar.gz): ./pithead upgrade verifies the bundle and every first-party image against the cosign.pub already on your host. The release key is the same one 1.20.x ships. To check by hand with cosign:
cosign verify-blob --key cosign.pub --signature pithead.tar.gz.sig --insecure-ignore-tlog=true pithead.tar.gz
cosign verify --key cosign.pub --private-infrastructure ghcr.io/p2pool-starter-stack/pithead-dashboard:v2.0.0Repeat the image check for each image in ingredients-v2.0.0.md.
| Asset | SHA-256 |
|---|---|
pithead-os-v2.0.0.img.xz |
7958223c077bcaf4a4673e492471c763e564199fdb9663f4aa12504ac3573f63 |
pithead-os-v2.0.0.raucb |
58e690e73bb5224fdfe64ee39f814161d26d10f54e9f60d55bb03cdca58ea0b6 |
pithead.tar.gz |
761600817639dae92ebcffed2aae2e166d9bad70b9ff7afca4722408af42dcca |
cosign.pub (release key, at the tag) |
7548180938a28654ff273920875a6cea12e871f73633090f375b9592f4e97453 |
Ingredients — Pithead v2.0.0
- Version: 2.0.0
- Commit:
c59e5ad6fc7c1fe82eb7558a2f962c18c1266299 - Built: 2026-10-13T19:24:00Z
Published images (ghcr.io/p2pool-starter-stack, tags v2.0.0 + latest)
ghcr.io/p2pool-starter-stack/pithead-tor:v2.0.0- digest:
ghcr.io/p2pool-starter-stack/pithead-tor@sha256:ac5b3dc2cdfca77066c0a2afb8905b3fcf3dc226f2f14ff0940090f7d35cacb4
- digest:
ghcr.io/p2pool-starter-stack/pithead-monero:v2.0.0- digest:
ghcr.io/p2pool-starter-stack/pithead-monero@sha256:c4ef1923863b9716e7fd462e30633519c16043517219685e53777f70b10eec35
- digest:
ghcr.io/p2pool-starter-stack/pithead-p2pool:v2.0.0- digest:
ghcr.io/p2pool-starter-stack/pithead-p2pool@sha256:789913c8b0b8841f5adaa4f17243b4e4c229a9a34ba49a77ecd44f699b7407d0
- digest:
ghcr.io/p2pool-starter-stack/pithead-xmrig-proxy:v2.0.0- digest:
ghcr.io/p2pool-starter-stack/pithead-xmrig-proxy@sha256:44d56bd4bb610d31f9e27c27346c61e7b3d75d7a6ad93d28e05a08d255f661e4
- digest:
ghcr.io/p2pool-starter-stack/pithead-dashboard:v2.0.0- digest:
ghcr.io/p2pool-starter-stack/pithead-dashboard@sha256:edc822a53ccba0d6d45c54409bf5da679ac3b5ec6efc21cbb1d1cc737cf94f7a
- digest:
ghcr.io/p2pool-starter-stack/pithead-os-rootfs:v2.0.0- digest:
ghcr.io/p2pool-starter-stack/pithead-os-rootfs@sha256:6ef616ffe715af55aa9d088b410b40486854e71414356e0c64090da2620f609b
- digest:
Upstream component pins
- p2pool:
v4.18.1 - monerod:
v0.18.5.1 - xmrig-proxy:
6.26.0 - tor base:
alpine:3.24@sha256:294b683cb724975bec92580e1e685676bd4b50bda910ddb8c51d4cabeaec77e6 - tari node:
ghcr.io/tari-project/minotari_node:v6.0.1-pre.0-mainnet@sha256:23ce381b74e48cf67677dfe85c800daf54a155a610c595c94b16db6b186950ec - tari console wallet:
ghcr.io/tari-project/minotari_console_wallet:v6.0.1-pre.0-mainnet@sha256:6f1f7d8990d304466f70a0379dcef4825c29b785c10d7fc7dff4d89163ed1b9d - caddy:
caddy:2.11.7@sha256:f2a1290d0463aad60660d4ec134943f183ee2a5f6c3eb7bf32dd984f2f020772 - docker-socket-proxy:
tecnativa/docker-socket-proxy:v0.5.0@sha256:1f5038b54f06c3e18422902cf00ba21803d1c97805aae032e5e6673d532d3459 - rigforge:
b2d4c3d9ca1da74d0e6d5ccce772d401acc8be03 - bundle sha256:
761600817639dae92ebcffed2aae2e166d9bad70b9ff7afca4722408af42dcca