πͺπΈ VersiΓ³n en espaΓ±ol
Equify is a native Android app for splitting group expenses: trips, shared flats, dinners or any plan with friends. Track who paid what and Equify instantly works out who owes whom, keeping the number of transfers low. No sign-up: open the app and start β your data stays on your device.
| Group summary | Settle up | About Equify |
|---|---|---|
![]() |
![]() |
![]() |
| Layer | Technology |
|---|---|
| Language | 100% Kotlin (coroutines + Flow) |
| UI | Jetpack Compose + Material 3, single-activity, Navigation Compose |
| Dependency injection | Hilt |
| Persistence | Room (offline-first, versioned schemas in app/schemas) + DataStore Preferences |
| Monetization | Google AdMob + Play Billing (remove_ads purchase) |
| Firebase | Crashlytics, Remote Config (force update) |
| Quality | Unit tests (JUnit), R8/ProGuard in release |
Clean Architecture organized by feature, with a strict data / domain / presentation split inside each one:
app/src/main/java/com/jarica/compartirgastos/
βββ app/ # Application class, global setup
βββ core/ # Code shared across features
β βββ billing/ # Play Billing (remove ads)
β βββ data/ # Room database, DataStore, mappers
β βββ di/ # Hilt modules
β βββ domain/ # Shared domain models
β βββ forceUpdate/ # Forced update via Remote Config
β βββ navigation/ # Type-safe Compose navigation
β βββ presentation/ # Theme and reusable composables
βββ features/
βββ groups/ # data / domain / presentation
βββ groupDetail/
βββ costs/
βββ payments/
βββ balances/ # Settlement algorithm ("settle up")
βββ people/
βββ appInfo/
βββ splash/
graph LR
UI["Presentation<br/>(Compose + ViewModel)"] --> UC["Domain<br/>(Use Cases + Models)"]
UC --> REPO["Data<br/>(Repositories + Room)"]
REPO --> DB[("Room / DataStore")]
Every screen follows the ViewModel β Use Cases β Repository flow, exposing UI state as StateFlow and keeping business logic in pure, testable use cases.
Long): all amounts are stored and computed in cents to eliminate floating-point rounding errors; formatting to decimal happens only in the presentation layer.DoTheCountsUseCase computes each memberβs net balance and applies a greedy algorithm that matches the largest debtor with the largest creditor, settling the group in at most nβ1 payments (the exact minimum is NP-hard). Covered by unit tests.app/schemas, enabling real, testable migrations.google-services.json to app/ (your own Firebase project)../gradlew assembleDebug
Release builds require your own keystore configured in local.properties (RELEASE_STORE_FILE, RELEASE_STORE_PASSWORD, RELEASE_KEY_ALIAS, RELEASE_KEY_PASSWORD).
Data is stored locally on the device. Privacy policy: jaricagames.github.io/Equify
This project is licensed under the MIT License.
Developed by Juan Antonio Rivero (@JaricaGames)