Architecture and tooling across build, test, release and advertising.
A deliberately simple Android app: all content ships inside the app, there's no backend and no user accounts. The engineering effort goes into the delivery pipeline. AI agents do most of the hands-on coding, and every change still goes through a pull request, automated checks and my review.
Delivery pipeline
Feature branch→PR into dev→CI: format, analyze, tests + goldens→Debug APK artifact→Tag v*→Gated release build (APK + AAB)→Play testing track
Build and test
App
Flutter and Dart, Android first. Flutter pinned to 3.47.5; content (moves, routines, meal ideas) bundled in the app.
CI
GitHub Actions on GitHub-hosted ubuntu-24.04 runners: dart format, flutter analyze, flutter test including golden screenshot tests, then a debug APK uploaded as a build artifact.
Supply chain
Third-party actions pinned by commit SHA; Dependabot opens weekly update PRs for Dart packages and Actions.
Workflow
Feature branches and pull requests into dev; a dedicated AI agent owns the project day to day.
Release
Release pipeline
Pushing a v* tag runs release.yml: tests again as a release gate, then builds a release APK and Android App Bundle and publishes a GitHub Release.
Signing
The upload keystore lives only in a GitHub release environment that accepts v* tags and waits for my approval. It is decoded on the runner and deleted after the build. Google Play App Signing signs what users install.
Google Play
Uploads to a testing track via a small script using a Play service account. Internal testing first, then a closed test with a Google Group of testers (12 testers for 14 days before production).
Contact and policy
Privacy policy hosted on this site; apps@d11s.space via Cloudflare Email Routing.
Exploring advertising
Ads
Google AdMob banner ads, on in release builds only. Never shown on workout, rest or timer screens. Debug builds always use Google’s sample ad IDs, enforced by tests.
Consent
Google User Messaging Platform (UMP) consent form on launch where required (EEA/UK); the ads SDK starts only once consent allows. Settings shows ad privacy options.
Remove ads
A one-off in-app purchase through Google Play Billing, with purchases acknowledged and ownership cached on the device. No subscriptions.