37
GitHub Actions workflows across CI, release, store ops, analytics, and repo automation.
The Random-Timer repository is not just a mobile app repository. It behaves more like a compact release platform: native builds, store metadata sync, browser-level console verification, device automation, security scanning, growth reporting, and AI-assisted repo operations all live in one system.
37
GitHub Actions workflows across CI, release, store ops, analytics, and repo automation.
14
Maestro mobile flows for smoke tests, regressions, and cross-app behavior checks.
43
Python automation scripts for release ops, App Store Connect, Google Play, growth, and reporting.
47
Python tests protecting those automation scripts, which is a serious maturity signal.
He treats app shipping as a system, not a button press. Release publishing, store readiness, screenshots, App Review prep, Play Console validation, and device tests all have explicit code paths.
The Makefile, native CI jobs, release preflight script, Python verification scripts, Playwright store-console checks, and the reusable weekly runner are the highest-leverage patterns.
There is visible config drift. Some docs still mention Expo, React Native, or workflow names that do not exist anymore. We should copy living code, not older prose.
This is the split that matters for handoff. By the time you give me the GitHub repo link, the codebase should already contain the automation shell, workflows, checks, and docs. The remaining work should be mostly credentials, policy, and platform access.
The repo should start behaving like a disciplined mobile delivery repo on first push, even before store credentials exist.
I can prepare the slots, guards, and workflows, but I cannot generate the real credentials or platform approvals.
You should end up with a precise TODO list instead of a vague “some setup is still left” answer.
This grouping is the most useful way to understand the repo. It separates delivery plumbing from product growth experiments, so you know what must exist on day one versus what can wait.
GitHub Actions is the control plane. The repo uses standard hosted runners, reusable workflows, artifact uploads, concurrency controls, environment gating, and branch protection to keep delivery predictable.
Release automation is native-first: Gradle for Android, Xcodebuild and Fastlane for iOS, plus custom Python wrappers for store verification and Play publish logic. This is the real backbone of the repo.
The testing model is layered: native unit tests, iOS simulator tests, Android emulator/device tests, Maestro mobile flows, ADB shell checks, Playwright store-console tests, and an optional agent-browser execution path.
The repo uses both local and CI protection. Trunk handles linting and hygiene. CI adds gitleaks, CodeQL, Snyk, OWASP Dependency-Check, MobSF, npm audit, and custom release-readiness checks.
This is unusually strong. The repo has dedicated scripts and workflows for metadata sync, screenshot reset, review readiness, review submission, version resolution, release verification, and console access checks on both Apple and Google sides.
The repo goes beyond build-and-ship. PostHog, Apple Ads, wiki sync, ASO rotation, attribution feedback, North Star metrics, and growth content pipelines are all automated as scheduled workflows.
AI is used for more than code generation. Claude reviews pull requests, Seer contributes safety-focused review signals, docs mention CodeRabbit, and project metrics are pushed into issues and board state automatically.
This is the main thing to understand before copying anything. The repo has strong live automation, but it also carries some older files that no longer match the current native architecture.
| Pattern | Decision | Reason |
|---|---|---|
| Makefile as one human entrypoint | Copy | It centralizes everyday commands and makes the stack teachable. |
| Native CI in ci.yml | Copy | It verifies Android, iOS, Playwright local checks, Python scripts, and security in one lane. |
| Python release/store scripts | Copy | They turn fragile console work into auditable code. |
| Weekly growth and ASO automations | Adapt later | Useful once acquisition and analytics matter, but too heavy for day-one setup. |
| PhoneClaw visual checks | Adapt later | Interesting for physical-device validation, but not essential until the core lanes are stable. |
| Expo/EAS release workflow | Skip | It does not match the current native-only layout of the upstream repo. |
These are the flows worth stealing. Notice how both platforms use the same shape: preflight, credentials, build, upload, verify, then metadata/review work.
Best practice worth copying: he does not trust a successful upload by itself. He verifies the remote store state after upload.
Best practice worth copying: release logic is not buried entirely inside Fastlane. Important store rules live in testable Python.
The strongest idea here is not any single test tool. It is the coverage ladder. Fast, deterministic checks run early. Slower or more fragile device and console checks run in dedicated lanes.
| Layer | Main tools | Example entrypoint | Why it exists |
|---|---|---|---|
| Local day-to-day verification | Make, Gradle, Xcodebuild | make verify | One human command that runs platform checks without memorizing platform-specific syntax. |
| iOS test lane | Xcodebuild, simulator resolution script | ./scripts/ios_verify.sh | Runs unit tests on a valid simulator automatically, which removes a common source of local friction. |
| Android unit and instrumentation | Gradle, Android test APIs | ./gradlew testDebugUnitTest assembleDebug | Covers Kotlin logic quickly and leaves instrumented tests available when hardware/emulators are ready. |
| Mobile UI smoke and regressions | Maestro, Android emulator runner | maestro test .maestro/smoke-test.yaml | Exercises real user flows, app lifecycle, notifications, and regression paths on mobile UI. |
| Shell-driven device behavior | ADB, dumpsys, uiautomator | bash scripts/device-tests/run-all.sh | Validates things normal UI tests often miss: lock screen state, media buttons, notifications, audio focus, cross-app return. |
| Visual physical-device experiments | PhoneClaw scripts | bash scripts/device-tests/phoneclaw/setup-device.sh | Experimental layer for device-side visual confirmation. Interesting, but optional at first. |
| Store readiness checks | Playwright, agent-browser | npm run verify:strict | Checks screenshot inventory and metadata readiness before store submission work begins. |
| Read-only console verification | Playwright, saved auth state, agent-browser | npm run test:console | Confirms App Store Connect and Play Console show the expected app/version state without mutating store data. |
| Automation script protection | Pytest, coverage | python -m pytest scripts/tests/ -q --cov=scripts | Protects the store, release, growth, and reporting scripts that would otherwise be the most fragile part of the system. |
He uses multiple concentric rings instead of one giant gate. That is the right model for a repo that mixes Swift, Kotlin, shell, YAML, Node, and Python.
.trunk/trunk.yaml enables a broad lint mix including yamllint, trufflehog, taplo, oxipng, shfmt, shellcheck, markdownlint, osv-scanner, ktlint, dotenv-linter, checkov, actionlint, eslint, and prettier.
scripts/pre-commit adds secret scanning and targeted checks before changes even leave a developer machine. This is a strong pattern because it pushes failures earlier than CI.
security.yml runs npm audit, Snyk, OWASP Dependency-Check, CodeQL, gitleaks, and MobSF, then publishes results as artifacts. That gives both source-code and mobile-specific coverage.
.gitleaks.toml adds project-specific rules for Sentry auth tokens, Sentry DSNs, Expo tokens, and Firebase keys. That means the secret scan is tuned to the actual ecosystem being used.
verify_release.py checks what the store actually sees after upload, rather than assuming a successful API call means the release is truly ready.
There is even a Crashlytics stability check wired into CI using BigQuery export access. That is more advanced than typical mobile repos and shows production operations are part of the definition of done.
These layers are impressive, but they are not all equally urgent. The trick is to borrow them in the right order.
weekly-shared.yml is a very good pattern. It standardizes Python setup, optional package install, command execution, commits, wiki publishing, issue creation, and artifact upload into one reusable workflow.
main.yml computes issue, PR, activity, throughput, and Projects v2 swimlane metrics, then writes them into a status issue. This is repo operations as code.
The scripts folder includes ASO keyword rotation, attribution feedback, paid acquisition seeding, North Star guardrails, review velocity tracking, and content generation. Few app repos go this far.
claude-review.yml runs advisory PR review, optional auto-approval when review passes, and on-demand help through @claude. Seer is also configured as a review bot with required status checks.
The Playwright package is a major differentiator. It treats store consoles like production interfaces and verifies them with authenticated, read-only browser state.
Wiki sync and GitHub Pages publishing mean documentation and growth content are part of the same automation graph, not separate manual chores.
Without your actual GitHub repo, the main thing I can do now is build the operating model and the copy order so we do not waste time later. This is the sequence I recommend.
| Bootstrap item | Why we should do it | Recommended shape |
|---|---|---|
| Repository folder contract | Prevents workflow sprawl and makes future automation composable. | .github/workflows/, scripts/, tests/playwright/, .maestro/, docs/ |
| Human command contract | Removes tool memorization and makes onboarding faster. | make verify, make verify-ios, make verify-android, make maestro-ios, make maestro-android, make store-checks |
| Secret inventory spreadsheet or markdown | Most mobile release automation dies from invisible credential debt. | Track secret name, owner, source system, rotation policy, and workflow consumers. |
| Release readiness checklist as code | Store failures should happen before archive/upload time. | Borrow the upstream preflight script shape and tune it to your assets, URLs, and changelog rules. |
| Store console auth-state plan | Needed for browser-based verification later. | Decide who records Playwright auth state, where it is refreshed, and which CI secrets store the JSON blobs. |
If you want to audit the upstream repo yourself, start here. These are the files I would treat as the best source of truth.