Repository navigation
Releases: overbuildlabs/OverMobile
Release list
OverMobile v1.2.0 Rebrand to OverBuild Labs
The app is now OverMobile by OverBuild Labs — matches the
website, OverManager desktop app, and OverMiner hardware line. Application
identity (applicationId), on-disk preferences, and the signing keypair
are unchanged: existing PoPMobile installs upgrade to OverMobile in place
with no loss of wallet, pool, pairing, or settings state.
Tag: v1.2.0
versionCode: 23
applicationId: com.proofofprints.kasminer (unchanged — v1.x installs upgrade in place)
Changed
- Brand → OverBuild Labs / OverMobile. Every user-facing surface — launcher label, splash, top bar, About card, settings, log copy/paste reports, notification text, OverManager pairing prose — now reads OverMobile / OverBuild Labs / OverManager / OverMiner.
- New launcher icon. Full adaptive + legacy + round set across all five densities, generated from the OverBuild hex/cube on a
#0C0C0Fbackground. - OverBuild Labs palette. Emerald-500 primary (
#10B981), violet-500 accent (#8B5CF6), neutral grey-black surfaces (#0C0C0Fpage,#16161Bcards) — matches the website and OverManager. ~80 hardcoded Kaspa-teal / gold / navy color literals migrated alongside the Material3 colorScheme so the entire dashboard tracks the brand instead of just the Theme. - Coin-agnostic logo. The in-app Kaspa hex (top bar, splash, About card) is replaced by the OverBuild hex — OverMobile is no longer visually locked to Kaspa as the SoC roadmap broadens.
- Dashboard typography polish. Card titles (SHARES / HASHES / THREADS / TEMP / BATTERY / THERMAL) move to a 10sp sans-serif with letter-spacing for a cleaner data-dashboard feel; values stay in monospace so digits + units line up across each row. HASHRATE value now white against the emerald label.
- Splash is single-phase. One 2-second hold of the OverBuild hex + white "OverMobile" wordmark, then into the dashboard. Company attribution moves to the About card.
- About card refreshed.
support@overbuildlabs.comandhttps://www.overbuildlabs.com. Info button replaced with Material'sIcons.Outlined.Info— crisp at every density. - Worker name default for fresh installs is now
OverMobile; existing installs keep their saved value. - Device telemetry reports
manufacturer="OverBuild Labs"to OverManager (was"Proof of Prints"). - Top bar fits on one line. Title shrunk to 15sp white monospace + 28dp icon so the OverBuild hex, wordmark, info button, Dashboard toggle, and Settings toggle all fit without wrapping.
Fixed
THERMAL WARNINGno longer clipped toWARNINon narrow screens. Compact stat-card values drop to 16sp + ellipsis overflow so the longest labels fit cleanly.
Deferred to a later release
- GitHub repository URLs still point at
github.com/proofofprints/...— the org has not been renamed yet. pool.proofofprints.cominfrastructure unchanged.- QR pairing wire-type identifier
popmanager-registeraccepted as-is until OverManager flips to emitovermanager-register.
Notes
applicationId,namespace, JNI symbol names, and on-disk SharedPreferences file names (kas_miner,popmanager) are unchanged. The rebrand is brand-only — protocol- and state-stable.
Checksums
- Windows:
certutil -hashfile popmobile-v1.2.0.apk SHA256 - macOS / Linux:
shasum -a 256 popmobile-v1.2.0.apk
SHA-256: <paste lowercase hash from your PowerShell $hash>
Or verify against the .sha256 file in the assets:
- Linux / macOS:
sha256sum -c popmobile-v1.2.0.apk.sha256
PoPMobile v1.1.1
First APK build of the 1.1 series. v1.1.0 was tagged but never published with
a binary, so this release rolls up everything that landed since v1.0.14.
Added
- Live (windowed) hashrate. The hashrate display now reflects what the
device is actually doing right now (10-second window) instead of a lifetime
average that smeared over throttling events. Stops decaying to a fixed value
and hard-zeroes once mining is stopped. - User-configurable thermal + power protection. Settings now exposes
pause / resume temperatures, a battery cutoff %, "require charging" toggle,
and an "external power mode" for plugged-in stationary use. Replaces the
hard-coded 70 / 60 °C defaults. - Protection-state banner. A coloured banner above Start / Stop says why
mining is paused, throttled, or running with reduced protections (battery
cutoff, unplugged, thermal critical, cooling, sensor unavailable, external-
power mode, etc.) — instead of failing silently. - Battery Saver detection. When Android's Battery Saver is on, the banner
shows "Battery Saver active — OS throttling" so a sudden hashrate drop
isn't mistaken for an app bug. - Temperature + banner stay live when stopped. Hitting Stop no longer
freezes the TEMP / BATTERY / banner readouts at their last values; the
thermal poller keeps running. - PoPManager pairing QR scanner. Scan a pairing code from PoPManager
instead of typing it. ZXing is bundled in the APK — no Play Services
dependency, works fully offline. - In-app Thermal Diagnostics card (Settings → Thermal Diagnostics).
Lists every thermal zone the OS exposes, the one protection is acting on,
PowerManager headroom + thermal-status bucket, SoC model, and a
"Copy report" button so users on unsupported chipsets can paste a clean
bug-report into a GitHub issue.
Changed
- Thermal-zone selection broadened for non-Snapdragon devices. Public
Android temp-monitor apps all read from/sys/class/thermal/, but their
advantage is the breadth of zones they recognize. We now scan both
/sys/class/thermal/and/sys/devices/virtual/thermal/, recognize more
CPU/SoC hint zone types, and explicitly skip trip-point zones (which
return the trip threshold instead of the live temperature) and the
Qualcomm PMICsoczone (battery state-of-charge, not temperature).
Non-Snapdragon phones that previously showed--should now show a
real temperature. - Battery percent now matches the OS status bar. Reads
EXTRA_LEVEL / EXTRA_SCALEfromACTION_BATTERY_CHANGEDfirst, falls
back toBatteryManager.BATTERY_PROPERTY_CAPACITY. Several OEMs return
a smoothed, fast-charge-aware capacity that lags the real value by 5-10%,
so the in-app reading disagreed with the system tray (e.g. 90 % in app
vs 95 % in OS). - Battery cutoff is honored while plugged in. Previously the cutoff
applied only on battery; the user's "stop at X %" preference now applies
on AC too, so the device still trips at the threshold when plugged in. - Resume hard-capped below Pause. The Resume slider can no longer be
set above the Pause threshold (would have caused the engine to immediately
re-pause on resume). Thread count is also restored to the user's setting
after a throttle event instead of staying clamped. - PoPManager error parity. "Pairing code expired" message now matches
PoPManager's canonical wording so support docs line up across both apps.
Fixed
- Stop-mining restart regression in
statsUpdateLoop— Stop followed
by Start would leave the engine wedged because of a race between the
stats loop andonNewJob. The two paths are now decoupled. - Thermal-pause race + unbounded pool reconnect. A pause that landed
during a connection retry could spawn a second reconnect loop racing
the first; both paths are now re-entrancy-guarded. - Invisible CRITICAL thermal alert. The stats loop was reading a stale
thermalStatefrom a register because the field wasn't@Volatile, so
CRITICAL transitions never made it onto the banner — users only ever saw
"PAUSED — cooling" instead of the actual cause. kotlinx.coroutines.isActiveimport in the thermal poller — release
builds were failing to resolve it on some toolchains.- MiningEngine
LinkageErroron new JNI methods. Devices upgrading
from older builds with cached native libraries no longer crash the stats
loop when a JNI method signature changes; the loop swallows
LinkageErrorand keeps running. - Settings crash on rotation caused by an early
returninside the
diagnostics-card composable. - Slider integer truncation (thread count, temperature thresholds)
was rounding to whole values mid-drag, plus a Compose hover-state crash
on long-press of the slider thumb. Both fixed.
Notes
versionCode 22,versionName 1.1.1,applicationId com.proofofprints.kasminer(unchanged — v1.0.x installs upgrade in place).- v1.1.0's tag is left as-is for history; this release supersedes it.
PoPMiner v1.1.0
PoPMobile v1.1.0
First minor release since v1.0.10. Brings full thermal and battery
protection with a live status banner, PoPManager auto-discovery on
the LAN, and a pool client that recovers on its own when the bridge
bounces.
What's new
Thermal protection
User-configurable warn / throttle / pause thresholds with a separate
resume target. Auto-throttles to half threads on THROTTLE, auto-pauses
on CRITICAL, and auto-resumes after a 30-second sustained cooldown.
The status banner above Start/Stop tells you exactly why mining is
paused — distinguishes thermal critical, low battery, unplugged, and
cooling-after-pause, so you don't have to guess.
Battery & external-power modes
Battery-cutoff percentage is configurable, with optional "require
charging to mine". External power mode is for CellHasher / bench-PSU
/ battery-bypassed rigs — skips battery checks entirely so a phone
running off external 5V doesn't pause itself when Android reports
0% battery
PoPManager integration
- mDNS auto-discovery — PoPMobile finds your local PoPManager on the
LAN; no manual IP entry needed. - Telemetry continues reporting while mining is stopped, so the
device stays visible in PoPManager between sessions. - Remote start / stop / set-threads / set-config commands honored.
- QR-code pairing scanner is built in, ready for the upcoming
PoPManager release that will display the pairing codes.
Reliability
- Pool reconnect retries forever (with exponential backoff capped at
60 s) instead of giving up after ~7 minutes. If your stratum bridge
goes down for an hour and comes back, the miner reconnects on its
own — no Stop/Start needed. - Single-press Stop now actually stops mining. A race between the
stats-update loop and the StratumClient could previously re-start
the engine immediately after stop, requiring a second press. - THROTTLE actually reduces thread count. The same race used to
re-start at full thread count even after a "reducing to N threads"
log line. - CRITICAL pause is no longer racy — once the threshold is crossed,
mining stops and stays stopped until the resume threshold is met.
UI polish
- Landscape scrolling fixed.
- Numeric formatting forced to Locale.US so hashrate / temperature
display correctly in non-US locales. - Banner uses severity colors (red for CRITICAL, amber for WARNING,
blue for INFO).
Upgrading from v1.0.10
Seamless in-place upgrade. Settings, logs, and PoPManager pairing
are preserved.
Checksums
- Windows:
certutil -hashfile popmobile-v1.1.0.apk SHA256 - macOS / Linux:
shasum -a 256 popmobile-v1.1.0.apk
SHA-256: 2a746b1ebc7b8aff976a220e2378f3ecd140e4b1e37e29167af318e11a4bff92
Or verify against the .sha256 file in the assets:
- Linux / macOS:
sha256sum -c popmobile-v1.1.0.apk.sha256
PoPMobile v1.1.0-rc1
PoPMobile v1.1.0-rc1
⚠️ Release candidate — manual install only. The in-app updater
ignores pre-releases. Please report any issues you hit before we
promote this to v1.1.0 stable.Focus areas to validate: CRITICAL thermal pause actually stops
mining; THROTTLE drops to half threads and stays there;
single-press Stop works; pool auto-reconnects when the bridge
bounces; mDNS discovery finds PoPManager on your LAN.
PoPMobile v1.1.0
First minor release since v1.0.10. Brings full thermal and battery
protection with a live status banner, PoPManager auto-discovery on
the LAN, and a pool client that recovers on its own when the bridge
bounces.
What's new
Thermal protection
User-configurable warn / throttle / pause thresholds with a separate
resume target. Auto-throttles to half threads on THROTTLE, auto-pauses
on CRITICAL, and auto-resumes after a 30-second sustained cooldown.
The status banner above Start/Stop tells you exactly why mining is
paused — distinguishes thermal critical, low battery, unplugged, and
cooling-after-pause, so you don't have to guess.
Battery & external-power modes
Battery-cutoff percentage is configurable, with optional "require
charging to mine". External power mode is for CellHasher / bench-PSU
/ battery-bypassed rigs — skips battery checks entirely so a phone
running off external 5V doesn't pause itself when Android reports
0% battery
PoPManager integration
- mDNS auto-discovery — PoPMobile finds your local PoPManager on the
LAN; no manual IP entry needed. - Telemetry continues reporting while mining is stopped, so the
device stays visible in PoPManager between sessions. - Remote start / stop / set-threads / set-config commands honored.
- QR-code pairing scanner is built in, ready for the upcoming
PoPManager release that will display the pairing codes.
Reliability
- Pool reconnect retries forever (with exponential backoff capped at
60 s) instead of giving up after ~7 minutes. If your stratum bridge
goes down for an hour and comes back, the miner reconnects on its
own — no Stop/Start needed. - Single-press Stop now actually stops mining. A race between the
stats-update loop and the StratumClient could previously re-start
the engine immediately after stop, requiring a second press. - THROTTLE actually reduces thread count. The same race used to
re-start at full thread count even after a "reducing to N threads"
log line. - CRITICAL pause is no longer racy — once the threshold is crossed,
mining stops and stays stopped until the resume threshold is met.
UI polish
- Landscape scrolling fixed.
- Numeric formatting forced to Locale.US so hashrate / temperature
display correctly in non-US locales. - Banner uses severity colors (red for CRITICAL, amber for WARNING,
blue for INFO).
Upgrading from v1.0.10
Seamless in-place upgrade. Settings, logs, and PoPManager pairing
are preserved.
Checksums
- Windows:
certutil -hashfile popmobile-v1.1.0.apk SHA256 - macOS / Linux:
shasum -a 256 popmobile-v1.1.0.apk
SHA-256: 2a746b1ebc7b8aff976a220e2378f3ecd140e4b1e37e29167af318e11a4bff92
Or verify against the .sha256 file in the assets:
- Linux / macOS:
sha256sum -c popmobile-v1.1.0.apk.sha256
PoPMobile v1.0.10
Stacks the pipeline-verification version bump on top of the v1.0.9 progress-bar fix so a single merge brings both changes to main.
Commits
13c11ab— v1.0.9 progress-bar fix (from PR #16): replace Material3LinearProgressIndicatorwith a plainBoxto sidestep theKeyframesSpecversion mismatch that crashed Download158fbce— v1.0.10 version bump:versionCode 10 → 11,versionName "1.0.9" → "1.0.10", CHANGELOG entry
No functional changes beyond what's already in PR #16.
Why a second version for verification
The v1.0.9 builds were smoke-tested by Claude and built/installed by the maintainer, but the in-app Check for updates → Download → install path has never actually been exercised against a real newer release (every previous attempt hit the progress-bar crash before reaching install). v1.0.10 exists to give a v1.0.9 device something newer to find.
Test plan
-
./gradlew assembleReleasebuilds cleanly - Signed APK fingerprint matches
6c849abe… - Device running v1.0.9 → Settings → About → Check for updates → offers v1.0.10 → Download → progress bar renders + fills (no crash) → install screen appears → install → app reopens as v1.0.10
- Settings, logs, PoPManager pairing all preserved
Supersedes
Closes #16 — this PR contains all of it.
PoPMobile v1.0.9
v1.0.7 misdiagnosed the Download-button crash as an R8 issue. The NoSuchMethodError still reproduced with minification disabled on the emulator this session, ruling that theory out.
Root cause
compose-bom 2024.01.00 ships material3 1.1.2 and animation-core 1.6.0 together. Material3's LinearProgressIndicator internally calls KeyframesSpecConfig.at(Object, Int) (new 1.6 generic signature), but the bundled animation-core doesn't expose that overload — producing:
java.lang.NoSuchMethodError: No virtual method at(Ljava/lang/Object;I)
Landroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;
at androidx.compose.material3.ProgressIndicatorKt$LinearProgressIndicator
at com.proofofprints.popmobile.update.UpdateDialogKt.DownloadingBody
…the first time DownloadingBody tried to render after the user tapped Download.
Fix
Replace LinearProgressIndicator with a plain Box we draw ourselves. No KeyframesSpec, no internal animation, nothing to version-drift against. Visually identical (6 dp tall, rounded 3 dp, cyan fill on dark track), ~15 lines of code.
Version
versionCode 8 → 10 (skipping 9 to keep the broken v1.0.8 interim artifact distinguishable), versionName 1.0.7 → 1.0.9.
Test plan
-
./gradlew assembleReleasebuilds cleanly - Signed APK fingerprint matches
6c849abe… - Emulator on v1.0.7 → Settings → About → Check for updates → offers v1.0.9 → Download → progress bar fills (no crash) → install screen appears → install → app reopens as v1.0.9
PoPMobile v1.0.1
Internal Kotlin package rename from kasminer to popmobile. Upgrades in place — no settings loss, no re-pairing required.
PoPMobile v1.0.0
PoPMobile v1.0.0
First public release of PoPMobile — a Kaspa kHeavyHash miner for Android with optional PoPManager integration for remote monitoring and control.
Low hashrate expected on mobile devices. Do not expect meaningful profit — treat it as lottery-style mining.
Install
Download popmobile-v1.0.0.apk below, transfer it to your Android device, and tap to install. You may need to allow "Install unknown apps" for your browser or file manager in Android Settings.
Requires Android 8.0 (API 26) or newer. Tested on emulator and TCL A3X; please open an issue if something misbehaves on your device.
Highlights
- Native kHeavyHash miner (
arm64-v8a,armeabi-v7a,x86_64) ported from the KASDeck ESP32 reference - Stratum v1 client with extranonce support, 10 s connect timeout, and cancellable retry loop
- Rich pool status UX — specific error reasons (
REFUSED,TIMED OUT,DNS FAILED,UNREACHABLE,NO NETWORK) instead of a generic offline badge - Thermal monitoring + auto-throttle — pauses mining when the device gets too hot
- Live dashboard with hashrate, shares (accepted / rejected), hash total, thread count, temp, battery, and thermal state
- QR code scanning for the Kaspa wallet address (bundled ZXing, no Play Services dependency); handles bare,
kaspa:kaspa:…, and?amount=…URI forms - Foreground service keeps mining running in the background with a persistent notification and one-tap Stop
- Mining log showing the last 4 hours of stratum + share events
- PoPManager integration — pair once with a 6-digit code; telemetry every 30 s; remote commands (
set_config,set_threads,start,stop,restart) applied and acknowledged
Configure
Open Settings after first launch:
| Field | Example |
|---|---|
| Pool URL | stratum+tcp://pool.proofofprints.com:5558 |
| Wallet | kaspa:qyp… — paste or scan QR |
| Worker Name | any label (defaults to PoPMobile) |
| Threads | how many CPU cores to mine on |
Tap SAVE, then START MINING.
To connect to PoPManager, open Settings → PoPManager Integration, enter your server URL (http://host:8787), a device name, and the 6-digit pairing code from the PoPManager dashboard.
Full docs: README.
Known limitations
- Verified on Android emulator and TCL A3X only — other Android versions and OEM skins have not been exhaustively tested
- Play Store distribution is not available (Google prohibits on-device crypto mining apps); sideload the APK or use Obtainium / F-Droid
Checksums
After downloading, verify the APK:
- Windows:
certutil -hashfile popmobile-v1.0.0.apk SHA256 - macOS / Linux:
shasum -a 256 popmobile-v1.0.0.apk
SHA-256: bc491b3ceec2ae3657e75e0c4071944509c491722d5b861f3b300d43308f6bf0
Or verify against the .sha256 file in the assets:
- Linux / macOS:
sha256sum -c popmobile-v1.0.0.apk.sha256
What's next
- CI signed-build workflow (GitHub Actions)
- Rename Java package
com.proofofprints.kasminer→com.proofofprints.popmobile(will require re-pairing existing PoPManager devices) - Broader real-device testing
Thanks for trying it out. Bug reports and PRs welcome.