Homelab
Homelab · Architecture

How Nice Pro Portions is built

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

AppFlutter and Dart, Android first. Flutter pinned to 3.47.5; content (moves, routines, meal ideas) bundled in the app.
CIGitHub 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 chainThird-party actions pinned by commit SHA; Dependabot opens weekly update PRs for Dart packages and Actions.
WorkflowFeature branches and pull requests into dev; a dedicated AI agent owns the project day to day.

Release

Release pipelinePushing 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.
SigningThe 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 PlayUploads 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 policyPrivacy policy hosted on this site; apps@d11s.space via Cloudflare Email Routing.

Exploring advertising

AdsGoogle 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.
ConsentGoogle 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 adsA one-off in-app purchase through Google Play Billing, with purchases acknowledged and ownership cached on the device. No subscriptions.

← Back to the beta