Bitaxe Baller follows semver-ish versioning โ bug fixes and small UX changes get a patch bump (1.6.0 โ 1.6.1), feature additions a minor bump (1.6 โ 1.7), breaking changes a major bump (which we don't expect for a while). Mac releases ship as signed + Apple-notarized .dmg files; Windows releases ship as Authenticode-signed Inno Setup .exe installers (per-user, no admin) โ both platforms signed for every user as of v1.8.2.
v1.16.6 โ pool shown on each card + manual chain override
Two home-page improvements, both born from a real "which pool am I actually on?" debugging session.
Each home card now shows its pool. You can see at a glance which pool every miner is mining to โ host and port โ right on the card. If a miner has dropped to its secondary pool, the host turns amber with a fallback badge, so a miner that can't reach its primary is obvious instead of hidden. No more clicking into each device to find out.
Manual chain override. Baller auto-detects which coin a miner is on from its pool URL and payout address โ but a legacy 1โฆ/3โฆ address is byte-for-byte identical between BTC and BCH, so a miner pointed at your own node (a private IP with no chain hint) could land in the wrong group. Each device's detail page now has a chain selector (Auto / BTC / BCH / BSV / XEC / DGB / NMC). Pin it and the miner groups correctly on the home page โ with zero changes to the miner itself. Auto stays the default for everything else.
You no longer need Pro to reach your dashboard from outside your LAN โ or to view your fleet on the iOS / Android app.
Remote access is free, limited to one miner. Turn on Remote Access in the Pro panel, pair your phone with a code, and you're viewing your fleet from anywhere โ no port forwarding, no VPN. Free accounts see their first miner; Pro shows every miner. Previously remote access was Pro-only, so a free user who paired a phone landed on a blank screen. The per-tier device limit is enforced server-side on the relay, not in the app.
No phone-app update required. This is a desktop + relay change โ your existing iOS / Android app picks it up automatically once your desktop updates to v1.16.5. Nothing to reinstall from the App Store or Play Store.
"Fleet outlier" no longer cries wolf on mixed fleets. If you monitored a Bitaxe alongside higher-hashrate machines, the dashboard could flag the smaller board as a "fleet outlier" โ it was comparing raw hashrate against the fleet median, so a perfectly healthy device looked slow next to bigger ones. The check now compares each board against its own expected output (normalized for chip count and frequency), so a correctly-tuned device reads as stable no matter what it's sitting next to. A board genuinely lagging its own spec relative to its siblings is still flagged. This is a backend fix, so it reaches the iOS / Android viewer apps automatically too.
The update banner re-checks on its own. The "Update available" banner only checked once, when the dashboard page first loaded โ so if you left the dashboard open in a tab (the normal case on a mining rig), it could sit on an old version for days without ever telling you a new release shipped. It now re-checks every few hours automatically, no manual reload required.
Maintenance release โ no functional changes from v1.16.2. Realigns the version string across all platforms (Mac, Windows, Umbrel) and refreshes the in-app update feed so everyone lands on the same number.
v1.16.2 โ email field width + alert-storm suppression (hotfix)
Fixed: saving an email-alert address triggered a burst of "catch-up" alerts. The moment you entered a new alerts email, every miner already sitting in a tripping state (hot, offline, etc.) fired its alert at once โ an inbox-flooding welcome. New addresses now start from a clean slate instead of replaying the current state.
Fixed: the email-address input was too narrow to comfortably read a full address while typing it.
Fixed: the dashboard could freeze and stop refreshing. The new block-found tracker from v1.16.0 had a threading deadlock โ under the right timing the whole dashboard would lock up and only an app restart brought it back. Several users hit it. Resolved by switching the tracker's lock to a re-entrant lock (Lock โ RLock).
// what the dashboard does the moment a Bitaxe solves a network block
The lottery-hit release. If your Bitaxe ever solves a block, the dashboard now loses its mind โ sticky confetti overlay, until you dismiss it. Plus email alerts, better pool detection, and ETAs for every supported chain.
๐ Block-found celebration. Bitaxe firmware exposes a blockFound counter that increments every time a device actually solves a network block. The dashboard now watches it on every 5s poll and throws a full-viewport confetti overlay the moment it ticks up. Continuous confetti rain โ no auto-fade โ until you click Frame it. Survives reload (server-side ack is the source of truth). Multi-find catch-up: if your device was offline and the counter jumped by N, you get one celebration with "+N more block finds waiting". Free for everyone โ this is delight, not a Pro hook. Block finds are also persisted across restarts in ~/Library/Application Support/Bitaxe Baller/block_finds.json (Mac) โ the trophy shelf.
๐ง Email alerts (Pro). Get the same alerts you get on Discord, by email too. Add an address in the Pro modal's alerts section; the desktop forwards alerts (with your license key) through bitaxeballer.com/api/alerts/email which validates + sends via Resend. The Resend API key stays server-side โ never on user machines. Rate limited to 20 messages/hour per license as a spam defense. Block-found events fire through this pipeline too โ the email subject line literally says "๐ BLOCK FOUND".
โ๏ธ Pool detector โ DigiByte + eCash coverage gap fixed. Pointed a Bitaxe at us1.letsmine.it for DGB and it was getting grouped with BTC because the chain detector's URL needles only matched dgb./digibyte. Added letsmine, digihash, dgbpool, weminemore for DGB; xeggex, viabtc for XEC. Plus bech32 detection for dgb1... worker addresses (unambiguous; legacy D... base58 collides with DOGE so we don't read those). New regression test fixture catches future drift.
๐ Years-until-block for every supported chain. The home-page Fleet Block ETA tiles already worked for BTC + BCH; now BSV / XEC / DGB / NMC all render the same way. Side benefit of the chain-detector fix: pointing a miner at any supported alt-chain now produces its own ETA tile instead of falling through to BTC. NMC specifically: chainz.cryptoid dropped Namecoin support so we fall back to BTC's difficulty (correct because NMC is merge-mined with BTC).
๐ Pair flow now auto-enables Remote Access. Clicking "Pair a new device" used to mint a code regardless of whether Remote Access was on โ leading to "I paired but my phone shows no miners". Now Pro users get Remote Access auto-enabled (with a toast confirming) when they hit Pair, so the trap is impossible to fall into. Already landed last Friday; rides this release out to all users.
v1.15.1 โ pool profiles, QR pair codes, 900 MHz cap, form pause-while-editing
Two days of desktop work rolled into one tag, plus a server-side hotfix bundle that landed on bitaxeballer.com earlier today.
Pool profiles. Save named pool configs ("BTC โ Ocean", "BCH โ letsmine.it", "BTC โ Public Pool", whatever you want) and apply with one click to any device. Useful for bouncing between BTC and BCH, or between two BTC pools (Public Pool vs Ocean vs Solo CKPool). New panel above the manual pool form on every device detail page: dropdown + Apply / Save current asโฆ / Delete. Passwords stay write-only โ if a profile needs a non-default password, type it on the manual form after applying.
QR pair codes. The Pro modal's "Pair a new device" panel now renders a scannable QR code next to the 22-character text, plus a Copy button. Combined with the v1.2.0 Android update (in Play review now) and the iOS build still working through Apple's review, you can now scan the desktop's screen with your phone's camera and pair in three taps. No more 22-char typing race.
Frequency cap raised 700 โ 900 MHz. Empirically, BM1370 silicon-lottery winners with adequate cooling can stably hit 800-900 MHz at 1200 mV. The 700 cap was too conservative for users tuning good chips. ASIC voltage ceiling stays at 1300 mV โ that's Bitmain's hard spec and sustained operation above ~1225 mV accelerates wear regardless of cooling. Manual-tune tooltip rewritten with real-world numbers (525-575 MHz stock, 800-900 MHz for tuned winners).
Form inputs no longer revert during a 5-second poll. Real bug. If you typed a new pool URL (or any other input) but the next telemetry refresh fired before you hit Apply, the field used to revert to whatever the device last reported, losing your typing. The device-detail page now pauses its wholesale re-render while any input is focused or has unsaved changes. Last-updated timestamp shows "paused (editing form)" while you're typing so you know the page is still alive.
Server-side fixes (no app update required). All deployed live on bitaxeballer.com / relay.bitaxeballer.com today: pair-token TTL on /test-pair raised from 60s โ 5 min for App Review-friendly testing windows; pair-redeem normalizes iPadOS Smart Punctuation (en-dashes back to ASCII hyphens) so hyphens in pair tokens survive auto-correct; /api/relay/* now sends proper CORS headers so the Capacitor mobile apps' fetches stop hitting "Load failed"; the demo desktop is exempt from the relay's idle-disconnect sweep and its reconnect backoff resets after each successful connection.
Bitaxe Baller mobile is live on Google Play
Released 2026-06-03 (silently approved by Google ยท noticed 2026-06-10)
The Android mobile companion is live on Google Play โ the iOS counterpart is still working through App Review and will ship as soon as it clears. The mobile app pairs to your desktop install via a 22-character pair code and gives you fleet hashrate / temps / 90 days of history wherever you are. Free for everyone (Pro license unlocks unlimited paired devices). Get-it-on-Google-Play badge added to the site's home page.
v1.15.0 โ Fleet ROI overlay + rollup of today's hotfixes
Headline: a fleet-level block ETA on the home dashboard. Plus a minor version bump that forces today's earlier hotfixes (v1.14.1โv1.14.3) to surface in the update banner for any user who was trapped on v1.14.0 by the now-fixed patch-suppression rule.
Fleet ROI overlay. A new headline tile below the summary HUD on the home dashboard shows the expected time until your combined fleet solves a block at current network difficulty โ one tile per chain, so a mixed BTC + BCH fleet gets two rollups. The math is what you'd expect: sum each device's per-second block probability, invert, format. Per-device "1 in 5,000 years" is depressing; "your 5-Bitaxe fleet solves a block in ~1,000 years" is just slightly less depressing โ but the fleet number is the right one to look at.
Rolls up v1.14.1โv1.14.3. Same code as v1.14.3 plus the ROI feature. If you were on any v1.14.x, this is the release that finally banner-prompts you to upgrade. Includes: pywebview persistence fix (theme/unit settings survive restart), MAC-based device dedup + offline-card remove button, banner-rule fix (patch releases now surface).
v1.14.3 โ patch releases now surface in the update banner (hotfix)
Fixed: the dashboard "Update available" banner was suppressing all patch-only bumps (1.14.0 โ 1.14.1, 1.14.1 โ 1.14.2, etc.). The original rule only banner'd minor/major bumps, on the assumption that patches are cosmetic. That assumption broke down as soon as today's patches were real hotfixes โ v1.14.1 (settings persistence regression) and v1.14.2 (duplicate-card bug) both got swallowed silently for users on v1.14.0, even though they fixed user-visible bugs. The banner now fires for any newer published version. The dismiss button still stores dismissals per-version in localStorage, so users who genuinely don't care can mute one release without losing every future notification.
Fixed: duplicate cards when a device's IP changes (DHCP โ static, or any IP rebind). Adding a device used to only check whether the IP was already in the config โ so when you scanned a Bitaxe at its DHCP-assigned address, then set a static IP and re-added it, the dashboard ended up with two cards for the same physical miner (one perpetually offline at the old IP). /api/devices/add now also checks the new device's macAddr against the last-known MAC of every existing tracked device. Same MAC at a different IP transparently re-binds: the old IP entry is removed, the existing label is carried over to the new IP, no manual cleanup needed.
Remove button on offline cards. Compact device cards on the home dashboard now show a ร button (top-right) when a device is offline โ one click to remove a stale duplicate, with a confirm prompt. Online cards are unchanged; their detail page already has a Remove button.
v1.14.1 โ settings now persist across app restarts (hotfix)
Fixed: theme, hashrate unit (GH/s โ TH/s), and temperature unit (ยฐC / ยฐF) preferences reset every app launch. The packaged Mac and Windows builds wrap the dashboard in pywebview, whose default private_mode=True ran the embedded webview in incognito mode โ meaning localStorage got wiped on every close. We now pass private_mode=False with an explicit persistent storage_path under the app's data directory, so all UI preferences survive restarts going forward. Existing settings will need to be set once after upgrading; from then on they stick. No effect on source-mode (Linux python app.py + system browser) or Umbrel โ those used the system browser / browser localStorage and were never affected.
No application-layer changes vs v1.14.0. Same multi-coin Solo Block Probability, same pool grouping, same fleet-outlier rec, same Gamma 602 auto-tune fix.
v1.14.0 โ multi-coin Solo Block Probability, pool grouping, fleet outliers, auto-tune VR fix
Headline: the Solo Block Probability widget is now coin-aware, the home dashboard groups cards by pool when you have a mixed-chain fleet, a new fleet-outlier rec flags underperforming devices, and a critical auto-tune fix lands for Gamma 602 boards.
Multi-coin Solo Block Probability. The widget on each device page now detects which chain the Bitaxe is mining (BCH, BSV, eCash, DigiByte, Namecoin, or BTC) and reports the correct chain's network difficulty, block reward, USD price, and odds. Detection priority: the payout-address prefix on the stratum user (bitcoincash: โ BCH, ecash: โ XEC) wins over URL pattern matching โ cashaddr prefixes are unambiguous, pool URLs aren't. Per-chain stats fetched from mempool.space / blockchair.com / whatsonchain.com / chainz.cryptoid.info, cached 10 minutes.
Pool grouping on the home dashboard. When your fleet spans multiple chains, the home page groups device cards by pool with a section header per chain ("BITCOIN CASH ยท gb1.letsmine.it ยท 1 device"). Single-chain fleets render flat as before โ no behavior change unless you're actually mixing chains.
Fleet outlier detection. New informational rec when a device's hashrate drops below 80% of the fleet median (within the same chain), or when its HW-error rate is more than 2ร the fleet median. Requires โฅ3 same-chain devices to mean anything statistically. Useful for spotting silicon-lottery duds, mounting issues, or a Bitaxe that's running hot.
Auto-tune VR threshold split (Gamma 602 fix). The single 65 ยฐC abort threshold for both ASIC and VR temps was wrong โ VR can safely run hotter than ASIC. Gamma 602-revision boards routinely idle their VR at 68-70 ยฐC, which was tripping the abort instantly. ASIC abort stays at 65 ยฐC; VR abort raised to 85 ยฐC (BM1370 VR pads are spec'd ~95 ยฐC, so 85 is conservative). If auto-tune kept aborting on you with "VR temp 68 ยฐC โฅ 65 ยฐC", this is the fix.
Three follow-on ideas parked in PRO_FEATURES.md: fleet auto-tune campaigns (Pro candidate), chip-level normalized comparison (GH/s per Watt per MHz across the fleet, free), and fleet ROI overlay ("your fleet will solve a block in ~X days", free).
Leaderboard โ monthly contest & fairness rework
Server-side ยท live 2026-06-01 ยท no app update required
The public leaderboard's prize race is now a monthly contest instead of an all-time one, so a single lucky share can't win every month forever. Full details on the new how-it-works page.
"This week" card โ "this month". It now shows the biggest new best-share each miner finds in the current calendar month, counted from signup โ never your all-time high. Resets to zero for everyone at midnight UTC on the 1st, and it's the board the monthly prize is drawn from.
No more permanent #1. A miner who found a monster share long ago and never reboots no longer re-wins every month off that one stale value โ only genuinely new shares count.
3-and-out winner rule. You can win your model up to three months in a row, then sit out 90 days so the prize cycles to other miners. After the cooldown you're eligible again.
New leaderboard rules page laying out exactly how scores are calculated and how winners are picked, linked from the leaderboard intro.
All-time board unchanged. Career records stay on permanent display as bragging rights โ only the prize board resets.
v1.13.2 โ Umbrel /data permission hotfix
Released 2026-05-29 ยท Umbrel community store only
Fixed "Permission denied: /data/logs" crash loop on first install. Umbrel bind-mounts the app data dir owned by root, but the container ran as unprivileged uid 1000 and couldn't mkdir /data/logs. Image entrypoint now starts as root, chowns /data to the app user, then drops privileges via gosu before launching python (the standard Umbrel pattern, cribbed from imlenti/minerwatch). Runtime user is still uid 1000; only startup runs as root.
Same app code as v1.13.0. New image digest (the Dockerfile changed) but no application-layer changes. Mac and Windows users see no change.
v1.13.1 โ Umbrel port hotfix
Released 2026-05-29 ยท Umbrel community store only
Moved off port 5050 โ 13700/13701. Port 5050 collides with two existing official Umbrel apps (passky-server and home-assistant-fusion-ui), which caused "umbrel.local refused to connect" on first launch for users who had either installed. New default: Umbrel tile URL is http://umbrel.local:13700 (via app_proxy), direct LAN access at :13701. mDNS publishes bitaxe-baller.local:13701.
No application code changes vs v1.13.0. Same digest-pinned container image (sha256:426bdb4fโฆ), just compose + manifest tweaks. Mac and Windows users see no change.
Headline: Bitaxe Baller is now a one-click install on Umbrel. If you run an Umbrel home server (Raspberry Pi, mini-PC, or Mac Mini), Bitaxe Baller now lives there too โ same dashboard, same tuner, sitting alongside your Bitcoin Core / Mempool / Electrs apps. Add our community app source in the Umbrel UI, click Install, and you're done. Data persists to ~/umbrel/app-data/bitaxe-baller/ across reinstalls and Umbrel updates. Also: a temperature unit switcher.
Umbrel community app store. Source repo: github.com/465media/umbrel-bitaxe-baller-store. Paste that URL into Umbrel โ App Store โ Community App Stores โ Add Custom Store. Multi-arch Docker image (linux/amd64 + linux/arm64) covers Pi, Mac Mini M-series, and x86 mini-PCs. Image is pinned by SHA256 digest per Umbrel's supply-chain rules.
Temperature unit switcher. New ยฐC / ยฐF toggle in the dashboard header (next to the hashrate unit switcher). Choice is persisted to localStorage and propagates to every chart, alert threshold input, and tooltip on both pages. Conversion is one-way at the rendering layer โ raw values stay Celsius in the device API, in CSV logs, and in history.db, so historical data stays portable.
Container = no auto-open. New BITAXE_BALLER_NO_AUTO_OPEN=1 env var skips the webbrowser.open() that fires in source/native mode. Required for headless / container deployments.
Customizable data directory. New BITAXE_BALLER_DATA_DIR env var overrides the default ~/.config/bitaxe-baller path. Used by the Umbrel compose template to point at /data (bind-mounted to ~/umbrel/app-data/bitaxe-baller/data on the host).
New /healthz endpoint. Returns 200 OK when the polling thread is up. Container HEALTHCHECK uses it. Trivial response body, no auth, safe to scrape.
Pro tier and free tier are unchanged. Same license-key auth, same Stripe-based purchase, same relay-based remote access. Umbrel users with a Pro license get the same feature set as Mac/Windows users.
Public leaderboard is unchanged โ still free, still per-Bitaxe-model prizes. First public draw remains 2026-06-30 23:00 UTC. Verified email + โฅ24h activity required for prize eligibility.
Removed the OUI auto-flag rule from the daily auto-detection cron. The hardcoded Espressif OUI list was incomplete (D83BDA + 28372F were missing among others) and was flagging real Bitaxes as synthetic. The other auto-detection rules (IP burst, absurd hashrate, mimic detection) remain. Affected rows backfilled-unflagged.
v1.12.0 โ leaderboard is free, monthly prizes per model
Headline: the public leaderboard is now free to enter, and the top miner in each Bitaxe model wins a free month of Pro every month. Free-tier users sign up with a display name and an email (used solely to deliver prizes โ no marketing). Pro users keep their existing license-key authentication. Places 2-5 in each model get a one-time 20%-off Pro coupon.
Free-tier submission. v1.11 gated submission behind Pro. v1.12 opens it: any user can opt-in via the Pro modal's Public leaderboard section. Free users authenticate with a locally-generated install_uuid + verified email; Pro users still use their license key.
Email verification. First-time free-tier submission triggers a one-click verification email. Unverified emails can climb the board but aren't eligible for monthly prizes. Tokens expire after 7 days.
Monthly prize draw. Runs the last day of each month at 23:00 UTC. Per Bitaxe model with โฅ3 eligible entries: #1 gets a real Pro license with 30-day expiry (or 30 days added to an existing renewal); places 2-5 get a Stripe promotion code for 20% off Pro, valid 60 days. Both arrive by email automatically.
Eligibility filters. Verified email + โฅ24h polled activity + not flagged + not banned + email hasn't won in the last 90 days. Balances "anyone can play" with "no dominators."
Anti-abuse. Per-IP submit throttle (max 10 distinct MACs per IP per day). Daily auto-detection rules flag suspicious rows: IP bursts (>3 MACs from one IP in 7d), absurd hashrate (>50 TH/s on a single device), best-share within 1% of an older entry (mimic detection). Flagged rows are hidden from public board until admin clears.
Admin moderation panel. New /admin section. Per-row Remove / Ban / Flag actions. Bans block uuid + email + IP. Filters for flagged-only and unverified-only views.
IP capture disclosure. The submit endpoint records the connecting IP for abuse moderation only โ never shared, never analyzed for marketing, auto-purged 30 days after last activity. Privacy policy updated.
Public page updates. Prize callout with countdown to month-end. PRO/FREE/unverified badges on every row. Past-winners section showing the last 3 months of #1s per model.
Free month of Pro. Delivered as a real license key with tier='pro-monthly' + 30-day expiry. Paste into Pro modal; existing Pro users get +30 days on renewal.
v1.11.0 โ live share feed + best-shares leaderboards
Headline: see the shares as they land, and bragging rights across the fleet. Every device's detail page now streams a live share feed between solo block probability and tune & control โ three event types: accepted, rejected, and "new personal best" with the new diff value. On the home dashboard, a new fleet leaderboard widget under the device cards ranks your own devices by best-share difficulty. And Pro users can opt-in to the public cross-user leaderboard at bitaxeballer.com/leaderboard.
Live share feed. Synthesized from polling deltas (firmware doesn't stream per-share difficulties โ only counters and the running best). Ring buffer of 50 events per device. New-best events get a gold border + special highlight; rejected (HW errors) get red. Resets on app restart.
Fleet best-shares leaderboard (dashboard). Top 5 in your fleet by all-time best (career bestDiff) and session best (bestSessionDiff). Click any row to jump to that device. Gold / silver / bronze accents on ranks 1/2/3. Hidden when only one device is online โ no empty-state noise.
Per-device best-share badges on every home card next to the stats grid: BEST 1.68G, SESSION 412M. Best-share is a lottery โ a 1 TH/s Gamma can occasionally beat a 10 TH/s Supra on luck.
Public leaderboard (Pro opt-in). New Pro modal section with a display-name field + submit toggle. When enabled, the desktop app POSTs your device data to bitaxeballer.com/leaderboard every 5 minutes (and immediately on a new personal-best). Four categories shown publicly:
All-time best โ career best-share diff across everyone.
This week โ rolling 7-day, per-device weekly reset; anyone can spike here on luck.
Per-model โ top 10 within each Bitaxe model (Gamma, Supra, Ultra, Hex, NerdQaxe).
Lucky โ best-share รท avg hashrate; pure "who beat the odds."
Privacy. Submissions send: display name, MAC address, model, best-share diff, 15-min hashrate. Submissions do NOT send: IP, location, email, license key. The server stores only the SHA-256 hash of the license key, not the raw key. License is validated against the licenses table before any data lands โ invalid / expired keys are rejected 401.
Display names are validated against [A-Za-z0-9 ._-]{1,30} and a light profanity blocklist on the server. Entries with no activity in the last 30 days are hidden from the public board.
Headline: how close am I to a block? Every device's detail page now answers the question solo miners actually care about. New section between live metrics and tune & control shows daily / monthly / yearly "1 in X" odds at your current hashrate, plus a log-scaled proximity bar (cold-to-hot gradient with a positioned marker) of best share toward the network target.
Auto chain detection across six SHA-256d networks: BTC (default), BCH (bch. / solohash port 3337), BSV (bsv. / bitcoin-sv), XEC / eCash (xec. / ecash / bcha), DGB / DigiByte (dgb. / digibyte), NMC / Namecoin (nmc. / namecoin).
Live network data. Difficulty + USD reward pulled from mempool.space (BTC) and blockchair (BCH / BSV / XEC / DGB / NMC). Cached 10 minutes; serves stale cache on transient failures so the widget never blanks out.
Math sanity-checked against a reference app: at 621.89 GH/s solo BCH vs 680.89 G diff, daily odds matched 1 in 54,426 exactly (monthly + yearly off-by-one from rounding direction).
Block proximity uses logโโ(best_diff + 1) / logโโ(network_diff + 1) so the bar moves linearly across orders-of-magnitude closer to a solved block โ raw best/network would peg the bar at zero forever.
The new blockProbability field is additive on /api/devices and /api/device/<ip>; older clients that ignore unknown JSON keys keep working. The remote SPA serves the new field through but won't render the widget until a matching UI update lands (tracked separately).
Free tier only โ no Pro gating, no new dependencies.
Header gets a live remote โ live pill when remote access is on and the relay socket is connected โ at-a-glance confirmation that the relay link is healthy, without opening the Pro modal.
Pro modal autorefreshes the remote-status block every 2 seconds while open. Toggling on or off now updates the panel without a manual reload, and the share URL appears as soon as the connection is up.
Small CSS polish on the Pro modal's remote section: status pill alignment, copy-link affordance, hover states.
Headline: reach your fleet from anywhere. Pro users can now reach the Bitaxe Baller dashboard from any browser, anywhere โ no port forwarding, no VPN, no fixed IP. The desktop app opens an outbound WebSocket to relay.bitaxeballer.com; your remote browser hits the same relay and gets routed back to your local app. The same pipe is what powers the upcoming iOS + Android apps.
New (Pro)
Remote access via relay.bitaxeballer.com. Outbound-only from your network โ nothing inbound, no router config. License key is the credential; activating Pro automatically unlocks remote, and you opt in with a one-click toggle in the Pro modal. Session tokens are HMAC-SHA256 signed by a relay-side secret with a 24 h TTL โ the token is opaque, no license key sits in URLs or browser storage. Disable remote at any time and the connection drops immediately.
All safety bounds apply identically over the relay โ frequency 400โ700 MHz, voltage 1000โ1300 mV, etc. The security perimeter is the relay's license check plus a path/method allow-list and a message-size cap. The local app stays the source of truth for everything.
Read-only home view in v1.9.0: device cards with summary stats, live polling, severity-colored borders. Tuning + scanning + adding devices stay on the LAN dashboard for now โ those land in a follow-up. Per-device detail page with charts is also available remotely.
Privacy & data
The relay routes encrypted bytes between your browser and your local app โ Bitaxe Baller does not log, store, or inspect the contents of any session payload (hashrate, device labels, pool config, etc.). The only thing the relay sees on the wire is the license key during the initial handshake, and that's validated against the existing license server.
Free tier is unchanged and remains 100% phone-home-free. The LAN dashboard, mDNS publishing, network scanner, recommendation engine, tuning controls, daily CSV logs โ all untouched.
Under the hood
New relay/ service: FastAPI WebSocket router, in-memory registry, idle-disconnect loop. Single-binary deploy under a systemd unit, fronted by nginx on the existing site VPS. ~825 LOC, no external state.
New relay_client.py: app-side connector. Outbound WSS with the certifi CA bundle (so it works on every distro's stdlib), loopback HTTP dispatch to the existing Flask /api/* routes โ Flask sees a remote request as identical to a LAN browser tab.
WebSocket protocol preserves client-allocated request IDs end-to-end, so concurrent in-flight requests work cleanly.
Upgrading
Mac (Pro): v1.8.2's auto-update infrastructure delivers v1.9.0 in-place โ banner on next launch, click "install & restart," done.
Windows + free tier: the v1.7 update banner surfaces the download link to the GitHub release.
From source:git pull && pip install -r requirements.txt picks up the new websockets + certifi deps.
In-place auto-updates for Pro users (Mac + Windows). Pure-Python updater on the Sparkle 2 appcast schema. App downloads new versions in the background and prompts to install on next launch. Ed25519-signed appcast served from GitHub Releases; updater verifies signature before applying. Free tier keeps the v1.7 update-banner link to the GitHub release page โ Pro just makes it one click instead of a manual download.
Windows builds are now Authenticode-signed via Azure Trusted Signing (Verified publisher: Nathan Baldwin) โ every user, free and Pro. First-run still shows the standard Windows download warning (Microsoft's reputation system warms up over the first ~week of installs), but once past that, no further SmartScreen prompts. Clean-PC install test passed.
Update banner is now gated on minor/major bumps (1.8.x patches stay silent for the free tier banner; bigger jumps still surface).
Theme default respects OS prefers-color-scheme โ fresh installs match your system theme instead of always defaulting to dark.
Display toggle for hashrate units (GH/s โ TH/s). Click the unit in any hashrate readout to flip it across the dashboard. CSV and SQLite history still log GH/s internally โ toggle is display-only, so historical data stays comparable.
The paid tier ships. The free tier stays fully featured for single-device monitoring and tuning โ Pro is purely additive for users running a fleet. Buy at bitaxeballer.com/pro; license activation runs through the self-hosted license server at bitaxeballer.com/api/license; one license covers up to 5 machine activations. Manage your activations at bitaxeballer.com/account.
Pro features (new in v1.8)
Bulk tuning across selected devices. Multi-select cards on the home page with a per-card checkbox, then apply a preset (Stock / Mild / Balanced / Aggressive / Max) or custom freq / voltage / fan to every selected miner in one click. Server-side bounded, parallel fan-out via ThreadPoolExecutor. Max 64 devices per call.
Auto-tune sweeps with hardware safety guardrails. Frequency-only probe (voltage is never touched during a sweep), +25 MHz per 90-second observation window, capped at 8 steps. Hard abort + baseline restore if VR or ASIC temp reaches 65 ยฐC or HW error rate hits 5 %. Records the highest stable frequency it found and applies it.
Long-term history. Persistent local SQLite store, 90-day retention, with a new chart section on every device detail page. Range selectors for 24h / 7d / 30d / 90d with appropriate bucket sizes so even a 90-day view stays legible. Free tier keeps its 1-hour in-memory rolling window plus the daily CSVs โ nothing changes there.
Discord webhook alerts. Configurable triggers for "device offline more than N minutes", "VR temp โฅ X ยฐC", and "ASIC temp โฅ X ยฐC", with a 30-minute cooldown per device + trigger pair so a flapping device doesn't spam the channel. Test button to verify the webhook before relying on real alerts. Email + Telegram channels are coming in a follow-up release.
Pro modal. Activation, deactivation, and license status all from the dashboard header. Activated state is visually distinct (filled green with a soft pulse) so it's obvious at a glance.
Free tier fix
Expected hashrate now matches AxeOS exactly. The previous formula used frequency ร 2.28 (the BM1370 spec-sheet peak), which overstated expected by ~12% โ every healthy Gamma looked like it was underperforming. The new value reads the firmware's expectedHashrate field directly, with a smallCoreCount ร frequency / 1000 fallback. At 575 MHz the expected is now 1173 GH/s, matching what AxeOS shows on the same chip.
Notes
Pro features are visible-but-locked in the free build. Clicking a locked control (e.g. a Pro checkbox on a device card) opens the activation modal instead of doing nothing โ this is the marketing surface inside the app itself.
License validation is one HTTPS POST to bitaxeballer.com/api/license on activation, plus a once-per-24h re-check. No hashrate, no tuning data, no device info leaves your network. Free tier remains 100% phone-home-free.
Auto-updates (Sparkle on Mac, WinSparkle on Windows) are tracked for v1.8.x โ paired with a Windows code-signing certificate. The v1.7 update-banner notification stays in place for both tiers in the meantime.
Update banner was showing on every dashboard load, regardless of whether a new version actually existed. Users on v1.7.0 and v1.7.1 (the latest builds at the time) were incorrectly told an update was available. Root cause was a CSS specificity bug โ .update-banner { display: flex } silently overrode the user-agent's [hidden] { display: none } rule, so the hidden attribute was being ignored. Fixed by adding an attribute-qualified .update-banner[hidden] override.
Clearer wording: the banner now reads "Bitaxe Baller update available โ v1.X.X" instead of the more ambiguous "Bitaxe Baller v1.X.X is available." The word "update" is explicit so there's no confusion about what's being announced.
If you're on v1.7.0 or v1.7.1 and tired of dismissing the banner, install v1.7.2 โ the banner will only fire when there's actually something newer.
Update banner moved to the very top of the dashboard (above the header) and restyled as a solid accent-color bar. The v1.7.0 banner sat below the toolbar and used a subtle tint that blended into the page โ easy to miss. Now it's the first thing you see.
No backend changes. Anyone running v1.7.0 will see this notification fire on their next dashboard load.
Real Windows installer. No more portable .exe. v1.7+ ships an Inno Setup installer that drops files under %LOCALAPPDATA%\Programs\BitaxeBaller, creates a Start Menu shortcut (and optional Desktop shortcut), and registers a proper Uninstall entry under Settings โ Apps. Per-user install, no admin prompt.
~2 seconds faster cold start. Switched back to PyInstaller one-folder mode under the hood โ no more %TEMP%/_MEIxxxx extraction on every launch.
In-app update notification. Dashboard now checks GitHub Releases on page load. When a newer version exists, a dismissible banner appears with links to release notes and the download page. Per-version dismissal โ dismissing v1.8 won't suppress v1.9.
Upgrading from v1.6.x: just run the new installer. It detects previous installs and replaces them in place. Your tuning data (%APPDATA%\Bitaxe Baller\) is preserved.
True Chrome-style auto-update (download + install on next launch) is on the Pro tier roadmap, paired with a Windows code-signing cert.
Pickaxe icon now shows in the Windows taskbar. The v1.6.3 build embedded our icon in the .exe file resource (correct in Explorer), but the running app showed a generic blank icon in the taskbar. Root cause was a missing AppUserModelID โ without it, Windows can't associate the running pywebview window with the icon resource. Fix sets the AUMID (com.465-media.bitaxe-baller) at process start.
Icon cache caveat: if you previously ran v1.6.3 from the same path, Windows may cache the old (broken) icon for a few minutes. Saving the v1.6.4 .exe to a new folder forces a clean cache entry.
No Mac changes โ the fix is wrapped in if sys.platform == "win32", so the Mac build is identical to v1.6.2.
Windows .exe is now a single self-contained file. The v1.6.2 build shipped a .exe launcher that needed a sibling _internal/ folder to find python312.dll โ running the loose .exe failed with "The specified module could not be found". The new build bundles everything (Python runtime, packages, templates, WebView2 backend) into one ~16 MB .exe that runs from anywhere โ Desktop, Downloads, USB drive, no extraction required.
Tradeoff: first launch adds ~2 seconds while the bootloader extracts to %TEMP%/_MEIxxxx. Subsequent UI is unchanged.
No Mac changes โ the v1.6.3 release includes the same signed + notarized Mac build from v1.6.2.
SmartScreen still fires on first launch (still unsigned). Click More info โ Run anyway.
Windows installer. Same app, same features as the Mac build, now available as a .exe. Uses Edge WebView2 (built into Windows 10+) for the native window so it feels like a real desktop app rather than a browser tab.
The Windows .exe is not yet code-signed โ first launch triggers Windows SmartScreen ("Windows protected your PC"). Click More info โ Run anyway. We'll add a signing cert once download volume justifies the cost.
Dashboard footer copy fix: now reads "made with โฅ in NH" matching the marketing site.
Initial public Mac build. Signed + Apple-notarized.
What's in the box
Native Mac app. Click the icon, a window opens โ no browser tab on the host machine.
Live polling every 5 seconds: hashrate, ASIC + VR temps, power, J/TH efficiency, hardware error rate, rolling averages over 1m / 5m / 15m / 1h.
Health-at-a-glance card borders flag attention-needing devices: red for crit (overheat / errors), yellow for warn (climbing errors / unstable hash), accent-green for "good with headroom" tunable opportunities.
Tuning recommendation engine. Rule-based, transparent โ surfaces concrete suggestions like "drop 10mV", "try +25 MHz", "reset benchmark" with one-click apply.
Tuning presets for the BM1370 (Gamma) chip: Stock, Mild OC, Balanced, Aggressive, Max.
Manual tuning: frequency 400โ700 MHz, core voltage 1000โ1300 mV, server-side safety bounds.
Auto-fan toggle + manual fan slider per device.
Network scanner: parallel /24 probe finds every Bitaxe on your LAN in under 6 seconds. Already-added devices skipped automatically.
Pool / stratum config: edit primary + fallback URL, port, worker, password, TLS, suggested difficulty from the app. "Restart device after apply" on by default so changes take effect immediately.
mDNS publishing as bitaxe-baller.local โ other devices on your LAN can hit the dashboard from a browser without typing IPs.
CSV logging: one file per device per day in ~/Library/Application Support/Bitaxe Baller/logs/. Drop into Excel or pandas for tuning analysis.
Light / dark theme toggle; preference persists per browser via localStorage.
Inline tooltips on every metric, threshold, preset, and pool field.
What's coming next
Windows installer โ packaging is wired (GitHub Actions on tag push), waiting on a release window.
Pro tier โ bulk tuning across selected devices, auto-tune sweeps with HW-error guardrails, Discord/email alerts on offline or HW-error spikes, long-term history beyond 1h. Sign up on the home page to be notified.
Multi-model support โ presets + expected-hashrate coefficients for Supra (BM1368) and Ultra (BM1366), not just Gamma.