Thanks for considering a contribution. This is a small, focused civic-tech project — clear PRs with a single purpose land fastest.
You need:
- JDK 17 or 21 (Temurin recommended)
- Android Studio Iguana (2023.2.1) or newer — for the Android side
- Xcode 15 or newer — for iOS (optional; commonMain compiles without it)
- macOS, Linux, or Windows — all three should work for Android development
Clone and build:
git clone https://github.com/RomanTsisyk/eu-stats-multiplatform.git
cd eu-stats-multiplatform
./gradlew :composeApp:assembleDebugThe first build takes 5–10 minutes (Compose Multiplatform downloads its compiler classpath). Subsequent builds are fast.
./gradlew allTests # everything
./gradlew :feature-population:allTests # one module
./gradlew :core-jsonstat:allTests # the JSON-stat parserTests live in commonTest source sets. Use kotlin.test + Turbine — Mockk doesn't work on iOS targets so we use hand-written fakes.
We follow Kotlin official style conventions plus a few project-specific rules documented in CLAUDE.md:
Result<T>withLoading / Success / Errorfor all data-layer return typesAppError(sealed taxonomy) for every cross-boundary failure — never throw raw exceptions across the data/domain boundaryDispatcherProviderinjected — neverDispatchers.IOdirectly- No
!!anywhere; userequireNotNull,checkNotNull, or sealed-class exhaustive matching - Single class per file, file name matches the public class
- KDoc on every public type, public method, and non-obvious algorithm
Before submitting a PR, please run a clean build to confirm nothing's broken:
./gradlew :composeApp:assembleDebug allTests- Open an issue first for non-trivial changes (new features, behavior changes, refactors). One-line fixes can skip this.
- Branch from
main. Use descriptive branch names:fix/cohort-overflow,feat/comparison-screen. - Keep PRs focused — one concern per PR. If you find yourself touching 20 files for unrelated reasons, split.
- Reference the issue number in the PR description.
- Include a "How to verify" section: what command did you run, what output did you see, what manual check confirmed the change works.
Use GitHub Issues. Please include:
- What you did (commands, taps, screen)
- What you expected
- What actually happened
- Environment (OS, JDK, Android SDK, device/emulator)
- Logs or screenshots if relevant
Use GitHub Discussions for design questions, ideas, or "how do I…" type queries. Use Issues for confirmed bugs or concrete feature requests.
By contributing, you agree that your contributions will be licensed under the AGPL-3.0 (same as the project). This includes patches, documentation, and any other content you submit.
See LICENSE for the full text.