The Ultimate Strength Training Companion
Track workouts, monitor progress, achieve your fitness goals
Currently, the app is available only via GitHub Releasesand Google Play Console beta. A public release on the Play Store is coming soon!
Workeeper is a modern, modular Android application built with Kotlin and Jetpack Compose. It's designed to help you log and track strength workouts with a clean, intuitive interface and powerful features for monitoring your fitness progress.
- π All Trainings: Browse and manage past and scheduled workouts
- ποΈ Exercise Library: Comprehensive exercise database with search and filtering
- π Training Editor: Create and customize individual training sessions
- β‘ Exercise Editor: Quick input for sets, reps, and weights with intuitive UI
- π Progress Charts: Visualize your strength trends and improvements over time
- π Privacy-First: All data stored locally with Room database
- π¨ Modern UI: Built with Jetpack Compose and Material Design 3
This project showcases modern Android development practices with:
- ποΈ Modular Architecture: Clean separation between
app,core, andfeaturemodules - π MVI Pattern: Unidirectional data flow with State, Actions, and Events
- β‘ Handler System: Dedicated action processors (
ClickHandler,InputHandler,PagingHandler) - π Dependency Injection: Hilt with feature-scoped modules and assisted factories
- π§ͺ Comprehensive Testing: Unit tests with JUnit 5, Robolectric, and MockK
Workeeper has migrated from Koin to Hilt to align with the Android ecosystem and leverage compile-time safety:
- Singleton graph lives in
core/*/dimodules (for examplecore/dataStore/src/main/kotlin/io/github/stslex/workeeper/core/dataStore/di/CoreDataStoreModule.kt) and provides shared resources such as DataStore, dispatchers, Room, and repositories. - Feature-level bindings are defined per module (e.g.
feature/all-trainings/src/main/kotlin/io/github/stslex/workeeper/feature/all_trainings/di/AllTrainingsModule.ktandfeature/single-training/src/main/kotlin/io/github/stslex/workeeper/feature/single_training/di/SingleTrainingModule.kt) to keep handler stores and interactors scoped toViewModelComponent. - Assisted factories (like
core/dataStore/src/main/kotlin/io/github/stslex/workeeper/core/dataStore/core/DataStoreProviderFactory.kt) remain available for cases where runtime parameters are required. - Use the
@HiltViewModelannotation for new stores and prefer constructor injection across the codebase. Seefeature/charts/src/main/kotlin/io/github/stslex/workeeper/feature/charts/di/ChartsModule.ktfor a full example of how stores, interactors, and calculators are wired together.
βββ app/ # Application modules
β βββ app/ # Shared application code
β βββ dev/ # Development build variant
β βββ store/ # Production build variant
βββ core/ # Core functionality modules
β βββ core/ # Base utilities, logging, coroutines
β βββ ui/ # UI components (kit, navigation, mvi)
β βββ database/ # Room database implementation
β βββ dataStore/ # Preferences and settings storage
β βββ exercise/ # Exercise domain logic
βββ feature/ # Feature modules
β βββ all-trainings/ # Training list and management
β βββ all-exercises/ # Exercise library and search
β βββ single-training/ # Individual training details
β βββ exercise/ # Exercise editor and sets management
β βββ charts/ # Progress visualization
βββ build-logic/ # Convention plugins for consistent builds
βββ lint-rules/ # Custom linting rules and configuration
- Language: Kotlin 2.2.10
- UI Framework: Jetpack Compose with Material Design 3
- Architecture: MVI (Model-View-Intent)
- Database: Room 2.8.0 with SQLite
- Dependency Injection: Hilt 2.57.2 with AndroidX navigation integration
- Async: Kotlin Coroutines 1.10.2 and Flow
- Navigation: Custom navigation with shared element transitions
- Storage: DataStore for preferences
- Analytics: Firebase Analytics and Crashlytics
- Build: Gradle 8.14.3 with Kotlin DSL and custom convention plugins
- Testing: JUnit 5, Robolectric 4.16, MockK, Compose UI Test
- Static Analysis: Detekt 1.23.8 with custom architecture rules
- Android Studio (latest stable)
- Java 21 (JDK 21)
- Gradle 8.14.3 or newer
- Android SDK with minimum API 28 (target API 36)
- Device or emulator for testing
# Clone the repository
git clone https://github.com/stslex/Workeeper.git
cd Workeeper
# Build debug version
./gradlew :app:dev:assembleDebug
# Install on connected device
./gradlew :app:dev:installDebug
# Build release version
./gradlew :app:store:assembleRelease# Run all unit tests
./gradlew testDebugUnitTest
# Run instrumented tests
./gradlew :app:dev:connectedDebugAndroidTest
# Run all tests
./gradlew test# Run detekt (Kotlin static analysis)
./gradlew detekt
# Run Android Lint
./gradlew lintDebug
# Auto-fix detekt issues
./gradlew detekt --auto-correct
# Run all linting
./gradlew detekt lintDebugThe project includes custom linting rules that enforce:
- MVI pattern compliance: State immutability, Action naming, Event naming, Handler patterns
- Store validation: BaseStore extension, Store state rules, Handler constructor validation
- Dependency injection: Hilt scope validation (@ViewModelScoped, @Singleton)
- Compose best practices: Composable state handling and component rules
- Code style consistency: Unified naming conventions and patterns
MviStateImmutabilityRule- Ensures State classes are immutable data classesMviActionNamingRule- Validates action naming (Click*, Load*, Save*)MviEventNamingRule- Validates event naming (*Success, *Error, Haptic, Snackbar)MviHandlerNamingRule- Ensures proper handler naming patternsMviStoreExtensionRule- Validates Store classes extend BaseStoreMviHandlerConstructorRule- Validates handler constructor patternsMviStoreStateRule- Validates store state managementHiltScopeRule- Validates Hilt dependency injection annotationsComposableStateRule- Validates Composable component state handling
The project enforces strict security and code quality rules:
- Security: 12+ rules preventing vulnerabilities (SSL, file permissions, dynamic code loading)
- Memory/Lifecycle: 10+ rules preventing leaks and lifecycle issues
- Performance: 12+ rules ensuring optimal performance
- Code Quality: 15+ rules maintaining code correctness
- Accessibility: 5+ rules for better user experience
See LINT_IMPROVEMENTS.md for detailed rule documentation.
google-services.jsonin bothapp/dev/andapp/store/directorieskeystore.propertiesfor release builds- Environment variables or
local.propertiesfor build configuration
The app uses Firebase for analytics and crash reporting. Ensure you have the proper
google-services.json files configured for both build variants.
- Core modules (
core/*): Shared, reusable functionality - Feature modules (
feature/*): Self-contained user-facing features - App modules (
app/*): Application targets and shared app code - Avoid circular dependencies between modules
- UI triggers
Actions(Click, Input, Navigation) - Handlers process actions and interact with repositories
- Store updates
Stateand emits one-timeEvents - UI recomposes based on new state and handles events
- Unit Tests: Business logic, handlers, repositories (
src/test/) - Integration Tests: Database operations, API interactions
- UI Tests: Compose UI components (
src/androidTest/) - Handler Tests: MVI action processing and state updates
We welcome contributions! Please read our guidelines:
Follow Conventional Commits:
feat:New featuresfix:Bug fixesrefactor:Code refactoringtest:Adding or updating testsdocs:Documentation updateschore:Maintenance tasks
GitHub Actions pipeline automatically:
- Builds and tests on every PR
- Runs static analysis (detekt, lint)
- Generates APKs for releases
- Validates code quality and architecture
See .github/workflows/android_build.yml for details.
This project is licensed under the terms of the LICENSE file.
- **π± Google Play Store **
- π¦ GitHub Releases
- π Release Notes
- π Report Issues
- π Documentation
Built with β€οΈ for the fitness community
β Star this repository if it helped you!