app/contains the Android app; unit and instrumentation suites sit undersrc/testandsrc/androidTest.core/*supplies shared UI, design, analytics, logging, notifications, andcore/testingutilities.feature/*hosts vertical slices (agenda, settings, detail, onboarding); keep new flows in their own feature module.data/handles repositories and persistence;common/tasksholds task-domain models.build-logic/ships custom Gradle convention plugins;screenshot_testing/,scripts/, andbenchmarks/cover snapshot + baseline tooling.
./gradlew assembleDebugbuilds a debuggable APK../gradlew testDebugUnitTestruns JVM unit tests../gradlew connectedAndroidTestlaunches instrumentation tests withAtomTestRunner(device/emulator required)../gradlew detekt lintDebugenforces Kotlin + Android linting../scripts/verify-screenshots.shcompares Compose snapshots;record-screenshots.shrefreshes baselines.
- Kotlin uses the official style (
kotlin.code.style=official), 4-space indents, trailing commas when it aids diffs. - Prefer
PascalCasefor types,camelCasefor members,snake_casefor resources; Compose previews belong in*Preview.kt. - Keep modules isolated: share code through
core/common, not direct feature cross-deps. - Detekt (
atomtasks.detekt) runs locally and in CI; resolve warnings before pushing.
- Co-locate unit tests with source modules and lean on
core/testingfor coroutine and Hilt helpers. - Place UI and integration suites in
src/androidTest; rely on Compose test APIs and stable semantics. - Snapshot updates need new images in
app/screenshots/andscreenshot_testing/, plus a PR note. - Aim for unit coverage on new logic and add an instrumentation or snapshot check for user-facing UI.
- Commits stay short and imperative (
Fix hardcoded string,Update theme), referencing issues as(#123)when needed. - Rebase or tidy history before opening a PR; avoid merge commits.
- PR descriptions should state intent, local testing, and UI impact (attach screenshots or screencasts).
- Link issues, call out config or feature flag changes, and note any follow-up work.
- Signing uses
SIGNING_*env vars; never commit keystores or secrets. local.propertiesis for local SDK paths only. Firebase config lives inapp/google-services.json; coordinate with maintainers before altering analytics.