- Reuse existing code paths, components, and classes before creating new ones.
- Do not introduce parallel implementations for behavior already present in
apporshared. - Create a new class only when no suitable extension point exists; keep it small and feature-scoped.
- Store configuration in JSON only. For new configuration data, do not introduce XML, YAML, or
.propertiesformats. - Keep configuration schemas backward-compatible when possible and validate migration impacts in PR notes.
- Respect module boundaries: place reusable/domain logic in
shared, and Android/platform/runtime integration inapp. - Use existing DI patterns (Koin modules) instead of ad-hoc singletons or hidden global state.
- Prefer extending existing feature packages over creating new top-level feature namespaces.
- Treat
app/src/main/cppvendored trees (for exampleSDL,FNA3D,FAudio,gl4es) as external code; avoid edits unless dependency work is intentional. - Keep changes scoped to the task; avoid drive-by refactors in unrelated files.
- Preserve backward compatibility for persisted data and public contracts; document any required migration in the PR.
- Follow Kotlin official style with 4-space indentation.
- Naming: packages
lowercase, classes/objectsPascalCase, methods/variablescamelCase, constantsUPPER_SNAKE_CASE. - Keep boundaries clean: platform/runtime concerns in
app/core, user-facing features inapp/feature, reusable logic inshared. - No repo-wide ktlint/detekt is configured; run IDE reformat before opening PRs.
- Match existing history style:
feat(scope): ...,fix: ...,refactor: ...,chore: .... - Keep commits focused and self-contained.
- PRs should include: what changed, why, how it was tested (commands), linked issue (if applicable), and screenshots/video for UI updates.
- For bug fixes, include repro details: device model, Android version, and relevant logs.