From f037275b84509ff39f1dc3e5a4739430787867d2 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 20:38:02 +0100 Subject: [PATCH 1/4] chore(release): prepare 1.0.0 --- CHANGELOG.md | 13 ++++++++++++ CLAUDE.md | 2 +- README.md | 20 ++++++++++++++++++- .../android/en-US/changelogs/10000.txt | 7 +++++++ .../android/en-US/full_description.txt | 6 +++++- gradle.properties | 4 ++-- 6 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/10000.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f1a0b3..2396ace 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.0.0] - 2026-11-07 + +1.0 is the first release we consider complete. The app answers one question when you open it, whether every app you run is running, and it does that without root, without an account and without sending anything to anyone but your own server. It ships alongside CashPilot web 2.0 and CashPilot Desktop 1.0. + +### Added + +- **A new home screen that leads with one line.** "All 6 apps running", or what is wrong and what to do about it. When more than one thing needs you, the home screen shows them as a short ordered list. A stopped app has an **Open** button. One line shows the server state: when the phone last reported, or "No server · everything stays on this phone". Earnings come from your server, labelled with how old they are, and a single footnote marks a balance the provider reports for the whole account rather than for this phone. +- **A three-step setup** (welcome, permissions, server). Before each Android permission prompt, a screen says what CashPilot reads with that access and what it never reads. You can continue without the permissions or without a server; the home screen then says calmly what it cannot see. +- **A real connection test.** "Test connection" sends one report to your server and says what happened: connected, the server refused the key, the address needs `https://`, or no answer. Each case says what to check next. +- **Grouped settings** with the API key masked, a **Classic night** and a **Light** palette that follow the system theme, a demo mode with sample data and a banner saying so, a screen for when no supported app is installed, and a list of supported apps where links that carry CashPilot's referral code are labelled **Referral**. +- **Accessibility checked by tests.** Every tappable control is at least 48 dp and has a name TalkBack reads; every screen has a heading; the home screen reads in visual order; nothing is cut off or unreachable at font scale 1.3; text in both palettes meets WCAG AA contrast. Screenshot goldens of every screen, dark and light, in four situations (all running, problems, no server, no permissions) fail CI on any unintended visual change. + ### Removed +- **The public IP lookup.** Earlier versions asked `api.ipify.org` for the phone's public address. Nothing uses it now, so the app makes no request except to the server you set. - **Uprock is no longer watched on Android.** Google Play Protect removes Uprock's own app from phones, so a Play-listed CashPilot that sends people to install it would put the app's Play review at risk. The app now watches 10 apps. CashPilot web and Desktop keep Uprock. ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index 68528b8..8347d5d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,7 +60,7 @@ unreachable at font scale 1.3; TalkBack order on the home screen). Contrast is - **Release workflow:** Push a `v*` tag -> GitHub Actions builds signed APK+AAB, creates GitHub Release - **CI workflow:** On push to main -> debug APK + lint + signed release APK. On PR -> debug + lint only (no keystore access) - **Signing keystore:** a JKS file kept outside the repository (alias: `cashpilot`). **The password is NOT recorded here — this repository is public.** It is kept with the maintainer's other credentials. The keystore is base64-encoded in the GitHub secret `KEYSTORE_BASE64`. -- **F-Droid: NOT listed yet.** MR !35850 closed for inactivity on 2026-07-04, not rejected. Its open items are fixed: the dependency info block (off since v0.1.3) and the pipeline, whose cause was version drift (`gradle.properties` said 0.2.0/200 at tag v0.3.0). The recipe to resubmit is `fdroid/com.cashpilot.android.yml`, with NonFreeAdd declared; steps in `PUBLISHING.md`. +- **F-Droid: submitted, not listed yet.** MR !56196 (fdroiddata) adds the app at 0.4.0. Its recipe uses `UpdateCheckMode: Tags` and `AutoUpdateMode: Version`, so after inclusion F-Droid's checkupdates adds each new `vX.Y.Z` tag by itself, reading the version from `gradle.properties` at that tag; the APK it builds must match our release APK byte for byte. The recipe is `fdroid/com.cashpilot.android.yml`, with NonFreeAdd declared; steps in `PUBLISHING.md`. ## Architecture diff --git a/README.md b/README.md index fcf8b3b..b71e3c2 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,24 @@ CashPilot Android is the Android companion app for [CashPilot](https://github.com/GeiserX/CashPilot). It detects which passive income apps are installed and running on your phone, without root, and reports them to your CashPilot fleet dashboard. +## What's new in 1.0 + +

+ Home screen, dark: All 6 apps running + Home screen, light: 2 of 6 apps stopped, four things to fix listed in order +

+ +- **One line tells you if every app is running.** When something is wrong, the home screen says what and gives you the button to fix it, such as **Open** for a stopped app. +- **Setup explains each permission first.** Three short steps, a plain screen before every Android prompt, and you can skip the permissions or the server. +- **Test connection is a real test.** It sends one report and tells you whether the server answered and accepted your key. +- **Reports every 15 minutes through WorkManager**, with no permanent notification and no battery exemption request, as Google Play's policy expects. +- **Nothing leaves the phone except to your own server.** The public IP lookup is gone. +- **Accessibility is tested**: 48 dp touch targets, TalkBack labels and order, text at 1.3x size, WCAG AA contrast in the Light and Classic night palettes. +- **10 supported apps.** +- **In progress:** inclusion in F-Droid. + +CashPilot Android 1.0 ships alongside [CashPilot](https://github.com/GeiserX/CashPilot) 2.0 and [CashPilot Desktop](https://github.com/GeiserX/CashPilot-Desktop) 1.0. The full list is in the [changelog](CHANGELOG.md). + ## Features - Detects 10 passive income apps: EarnApp, IPRoyal Pawns, MystNodes, Traffmonetizer, Bytelixir, ByteBenefit, Grass, Titan Network, Nodle Cash, Wipter @@ -33,7 +51,7 @@ Needs Android 8.0 (API 26) or later and a reachable CashPilot 1.x server. Everything below is on the site, https://geiserx.github.io/CashPilot-android/. - [Getting started](https://geiserx.github.io/CashPilot-android/getting-started/): install the APK, the first-run steps, and what a working start looks like -- [Usage](https://geiserx.github.io/CashPilot-android/usage/): the dashboard, what each app state means, earnings, the notification +- [Usage](https://geiserx.github.io/CashPilot-android/usage/): the home screen, what each app state means, earnings, settings - [Configuration](https://geiserx.github.io/CashPilot-android/configuration/): every setting, the fleet key and enrollment, heartbeat timing, the app list - [How it works](https://geiserx.github.io/CashPilot-android/how-it-works/): the three detection APIs, the running rule, what a heartbeat carries, privacy - [Troubleshooting](https://geiserx.github.io/CashPilot-android/troubleshooting/): symptom, cause, fix, and what to put in a bug report diff --git a/fastlane/metadata/android/en-US/changelogs/10000.txt b/fastlane/metadata/android/en-US/changelogs/10000.txt new file mode 100644 index 0000000..d0af84d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/10000.txt @@ -0,0 +1,7 @@ +- New home screen: one line says whether every app is running, with an Open button for a stopped one. +- Three-step setup that explains each permission before Android asks. +- Test connection tells you if the server answered and took your key. +- Reports every 15 minutes with no permanent notification. +- No request leaves the phone except to your own server. +- Light and dark themes, TalkBack labels, room for larger text. +- Watches 10 apps. diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 2b90afc..e1737fa 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -2,6 +2,8 @@ CashPilot shows which of your passive-income and DePIN apps are installed, runni It watches EarnApp, IPRoyal Pawns, MystNodes, Traffmonetizer, Bytelixir, ByteBenefit, Grass, Titan Network, Nodle Cash and Wipter. For each one it shows whether the app is installed, whether it is running, and when it was last active. +When you open it, one line says whether every app is running. If something needs you, it says what, in order, with the button that fixes it, such as Open for a stopped app. + How it knows: - Notification access: most of these apps keep a notification up while they run, so CashPilot reads it to tell that the app is alive. - Usage access: when each app was last in use. @@ -9,7 +11,9 @@ How it knows: All of this is read on the phone. Without a server, the app list is the whole app. -With a self-hosted CashPilot server (https://github.com/GeiserX/CashPilot), the phone also joins your fleet. The app sends the apps' status to your server every 15 minutes, and the dashboard shows your earnings from the server. The phone sends app status, never notification content. +With a self-hosted CashPilot server (https://github.com/GeiserX/CashPilot), the phone also joins your fleet. The app sends the apps' status to your server every 15 minutes, with no permanent notification, and shows your earnings from the server. Test connection sends one report and tells you whether the server answered and accepted your key. The phone sends app status, never notification content. + +Setup takes three steps and explains each permission before Android asks for it. You can skip the permissions or the server. Light and dark themes follow the system. Every control has a label TalkBack reads, and the screens still fit with larger text. Privacy: no account, no analytics, no ads. Data goes only to the server you set. The app makes no other request. diff --git a/gradle.properties b/gradle.properties index b33ff5d..b952af3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,5 +2,5 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 android.useAndroidX=true kotlin.code.style=official android.nonTransitiveRClass=true -VERSION_NAME=0.4.0 -VERSION_CODE=400 +VERSION_NAME=1.0.0 +VERSION_CODE=10000 From c2a61f716a6155b47e601cc70240bb773683567c Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 20:39:54 +0100 Subject: [PATCH 2/4] docs: name the oldest server and Desktop releases the 1.0 phone works with --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b71e3c2..708e715 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ CashPilot Android 1.0 ships alongside [CashPilot](https://github.com/GeiserX/Cas 2. Grant Notification Access and Usage Access. Turning battery optimisation off for CashPilot is optional and makes late reports less likely; Android can still delay them. 3. In Settings, enter your CashPilot server URL and the fleet key (`CASHPILOT_API_KEY` on the server). Use `https://`; the app accepts `http://` only for a server on your own network: `localhost`, a LAN, link-local or Tailscale address (`192.168.x.x`, `10.x.x.x`, `172.16-31.x.x`, `169.254.x.x`, `100.64-127.x.x`), or a private name (`.local`, `.lan`, `.home.arpa`, `.internal`, Tailscale `.ts.net`). -Needs Android 8.0 (API 26) or later and a reachable CashPilot 1.x server. +Needs Android 8.0 (API 26) or later. To report to a server, it needs a reachable CashPilot server, 1.73.2 or newer (including 2.x), or CashPilot Desktop 0.39.6 or newer (including 1.x). ## Documentation From ef7eb6a8b14eb7d77dbfa836c02831dc53baa7fd Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:47:32 +0100 Subject: [PATCH 3/4] docs(changelog): list the late-report warning and the key handling in 1.0.0 --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2396ace..9af9648 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **A new home screen that leads with one line.** "All 6 apps running", or what is wrong and what to do about it. When more than one thing needs you, the home screen shows them as a short ordered list. A stopped app has an **Open** button. One line shows the server state: when the phone last reported, or "No server · everything stays on this phone". Earnings come from your server, labelled with how old they are, and a single footnote marks a balance the provider reports for the whole account rather than for this phone. - **A three-step setup** (welcome, permissions, server). Before each Android permission prompt, a screen says what CashPilot reads with that access and what it never reads. You can continue without the permissions or without a server; the home screen then says calmly what it cannot see. -- **A real connection test.** "Test connection" sends one report to your server and says what happened: connected, the server refused the key, the address needs `https://`, or no answer. Each case says what to check next. +- **A real connection test.** "Test connection" sends one report to your server and says what happened: connected, the server refused the key, the address needs `https://`, the address answers but is not CashPilot (a login page or another app), or no answer. Each case says what to check next. A report counts only when the server registered the phone. +- **Late reports show.** When no report has gone out for over an hour, the server line turns amber and the home screen says reports are late, instead of staying green while Android holds the work back. - **Grouped settings** with the API key masked, a **Classic night** and a **Light** palette that follow the system theme, a demo mode with sample data and a banner saying so, a screen for when no supported app is installed, and a list of supported apps where links that carry CashPilot's referral code are labelled **Referral**. - **Accessibility checked by tests.** Every tappable control is at least 48 dp and has a name TalkBack reads; every screen has a heading; the home screen reads in visual order; nothing is cut off or unreachable at font scale 1.3; text in both palettes meets WCAG AA contrast. Screenshot goldens of every screen, dark and light, in four situations (all running, problems, no server, no permissions) fail CI on any unintended visual change. +### Security + +- **This phone's own key never goes to another server.** Changing the server address, or typing a different fleet key, drops the key the old server issued, so the next report enrolls again with the details just entered. + ### Removed - **The public IP lookup.** Earlier versions asked `api.ipify.org` for the phone's public address. Nothing uses it now, so the app makes no request except to the server you set. From 5bb7559e21c469eb9028f4fd06bcc46750896ea6 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:48:57 +0100 Subject: [PATCH 4/4] docs(release): keep Google Play out of the 1.0 release text --- CHANGELOG.md | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9af9648..1685931 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,12 +27,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed - **The public IP lookup.** Earlier versions asked `api.ipify.org` for the phone's public address. Nothing uses it now, so the app makes no request except to the server you set. -- **Uprock is no longer watched on Android.** Google Play Protect removes Uprock's own app from phones, so a Play-listed CashPilot that sends people to install it would put the app's Play review at risk. The app now watches 10 apps. CashPilot web and Desktop keep Uprock. +- **Uprock is no longer watched on Android.** Android's built-in app scanner removes Uprock's own app from phones, so CashPilot no longer sends people to install it. The app now watches 10 apps. CashPilot web and Desktop keep Uprock. ### Changed - **Heartbeats run every 15 minutes on WorkManager instead of every 30 seconds from a foreground service.** The always-on special-use foreground service and its permanent notification are gone, and so is the restart-on-boot receiver: WorkManager keeps the schedule across restarts. The app also reports once when it is opened and once when the server URL or key changes. The last report and the last earnings figure are kept on disk, so the dashboard still shows them after Android stops the app between runs, and it now says "Last report 6 min ago · sent every 15 min" instead of implying live monitoring. -- **The battery button opens Android's battery-optimisation list instead of the direct exemption dialog**, and the app no longer requests `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS`. Google Play allows that permission only for chat, VoIP, safety, automation and peripheral apps. The setup screen says which entries to pick in the list. `POST_NOTIFICATIONS` is no longer requested either, because nothing posts a notification any more. +- **The battery button opens Android's battery-optimisation list instead of the direct exemption dialog**, and the app no longer requests `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS`. That permission is meant only for chat, VoIP, safety, automation and peripheral apps. The setup screen says which entries to pick in the list. `POST_NOTIFICATIONS` is no longer requested either, because nothing posts a notification any more. ## [0.4.0] - 2026-11-06 diff --git a/README.md b/README.md index 708e715..247d16d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ CashPilot Android is the Android companion app for [CashPilot](https://github.co - **One line tells you if every app is running.** When something is wrong, the home screen says what and gives you the button to fix it, such as **Open** for a stopped app. - **Setup explains each permission first.** Three short steps, a plain screen before every Android prompt, and you can skip the permissions or the server. - **Test connection is a real test.** It sends one report and tells you whether the server answered and accepted your key. -- **Reports every 15 minutes through WorkManager**, with no permanent notification and no battery exemption request, as Google Play's policy expects. +- **Reports every 15 minutes through WorkManager**, with no permanent notification and no battery exemption request. - **Nothing leaves the phone except to your own server.** The public IP lookup is gone. - **Accessibility is tested**: 48 dp touch targets, TalkBack labels and order, text at 1.3x size, WCAG AA contrast in the Light and Classic night palettes. - **10 supported apps.**