Important
Project status: active development.
Platform focus: Desktop (Windows-first runtime).
SimAnalyzer reads telemetry from racing simulators, shows live HUD panels, records sessions, and provides post-session analysis.
Planned product scope (TODO - fill later):
- TODO: Live telemetry HUD capabilities
- TODO: Session recording capabilities
- TODO: Post-session analytics capabilities
- TODO: Supported simulators and integrations
- Run the app
./gradlew :composeApp:run-
Understand module boundaries (
apivsimpl) -
Understand build conventions (
moduleApi,moduleImpl,app) -
Only then deep-dive into feature modules
- JDK 21
- Gradle Wrapper (
./gradlew)
git clone https://github.com/dev-darck/SimAnalyzer.git
cd SimAnalyzer
./gradlew :composeApp:runTop-level module groups:
:composeApp- desktop app entry point:core:*- shared app infrastructure (DI, navigation, telemetry, theme, utils):feature:*- screens and HUD features:games:*- game-specific integrations (AC, LMU):ksp:*- custom code generation toolingbuild-logic- Gradle conventions + project DSL
Most domains follow this split:
*/api- contracts and stable surface*/impl- concrete implementation
Examples:
:core:di:api+:core:di:impl:games:game:api+:games:game:impl:feature:screens:session:api+:feature:screens:session:impl
The repo uses DSL helpers from build-logic:
moduleApi { ... }moduleImpl { ... }app { ... }
- KMP library conventions
- Kotlin explicit API enabled
- used for public contracts
- same KMP base conventions
- explicit API not enforced
- used for implementation details
Rule of thumb: put interfaces/models in api; put behavior/wiring in impl.
Inside module DSL, dependencies are source-set aware:
commonImpljvmImpljvmTestcommonTestImpl
Example:
dependencies {
projects.core.di.api.jvmImpl
projects.core.di.impl.jvmImpl
lib.metro.runtime.jvmImpl
}- bindings live in
dipackages - ViewModels are multibound via
@IntoMap+@ViewModelKey - prefer clean module boundaries over direct cross-feature coupling
build-logic/conventions/src/main/kotlin/convention-project-dsl.gradle.kts can be intentionally empty.
It acts as a marker precompiled script plugin that exposes the DSL across all modules.
Apache License 2.0