diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f1a0b3..1685931 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,14 +7,32 @@ 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://`, 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 -- **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. +- **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.** 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/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..247d16d 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 + +
+
+
+