3 Gradle modules: :composeApp (shared UI + desktop), :androidApp (Android shell), :screenshotTests (Paparazzi).
Kotlin Multiplatform + Compose Multiplatform. Java 21, Gradle 9.5.1.
| Action | Command |
|---|---|
| Format code | ./gradlew spotlessApply --no-daemon |
| Check formatting (CI fails on this) | ./gradlew spotlessCheck --no-daemon |
| Desktop tests (CI runs these) | ./gradlew :composeApp:desktopTest --no-daemon |
| Record + copy screenshots | ./gradlew :screenshotTests:updateScreenshots --no-daemon |
| Verify screenshots vs golden | ./gradlew :screenshotTests:verifyPaparazziDebug --no-daemon |
| Quick screenshot record (kai-ui only) | ./gradlew :screenshotTests:recordKaiUiScreenshots --no-daemon |
| Generate Play Store screenshots | ./gradlew :screenshotTests:generateStoreScreenshots |
| Convert site PNGs → WebP | ./scripts/convert-site-images-to-webp.sh |
Several ktlint rules disabled in root build.gradle.kts:
no-wildcard-imports, package-name, function-naming, discouraged-comment-location, value-argument-comment, value-parameter-comment.
- Framework:
kotlin.test(@Test,@BeforeTest,@AfterTest). No Mockito/MockK — hand-written fakes only (e.g.FakeDataRepository). - Flow testing:
app.cash.turbine(viewModel.state.test { awaitItem() ... }). - Coroutines:
@BeforeTestsetsDispatchers.setMain(StandardTestDispatcher()),@AfterTestresets. - Screenshot tests: Use JUnit 4
@Rulewith Paparazzi (hybrid). Golden images atscreenshotTests/src/test/snapshots/images/(gitignored). CI auto-commits updated screenshots. - CI runs only desktop tests — no Android instrumentation or WASM tests.
Two pipelines in the README:
- README/site screenshots:
updateScreenshots— records Paparazzi goldens, copies toscreenshots/andsite/img/. Runs automatically on push. - Store screenshots:
generateStoreScreenshots— localized Play Store screenshots. Upload viabundle exec fastlane android upload_screenshots.
.github/actions/setup/action.yml — shared setup (JDK 21, Gradle cache, optional Android SDK). Used by all workflows.
Defines rules for updating feature docs in docs/features/. Must update "Last verified" date and Key Files table when modifying feature logic.