Spendly is a research project for the Junior Academy of Sciences of Ukraine (JASU) - a mobile app designed to improve financial literacy and help users track expenses.
By combining gamification, AI-driven insights, and a user-friendly interface, Spendly is positioned as an alternative to standard expense trackers.
You can download the APK from this link.
At the moment, Spendly supports only Monobank. This choice is intentional: Monobank is currently the only bank in the target region that provides a public API accessible to all users.
Spendly follows a clean, single-module MVVM (Model-View-ViewModel) architecture built entirely with Jetpack Compose.
app/
├── androidUuidGenerator/ # Device-based UUID generation
├── api/ # HTTP client setup (Digest Auth)
├── data/
│ ├── dto/ # Data Transfer Objects (API contracts)
│ ├── model/ # Domain models
│ ├── preferences/ # DataStore preferences
│ └── repo/ # Repositories (data access layer)
├── di/ # Koin dependency injection modules
│ ├── AppModule
│ ├── NetworkModule
│ ├── RepositoryModule
│ ├── ViewModelModule
│ ├── UtilModule
│ └── PreferencesModule
├── navigation/ # Navigation graph & bottom nav
├── service/ # Firebase Messaging, Speech, WebView
└── ui/
├── imageVector/ # Custom SVG icon definitions
├── screens/ # One package per screen (Screen + VM + UiState)
│ ├── Home/
│ ├── ChatScreen/
│ ├── Statistics/
│ ├── Target/
│ ├── Challenges/
│ ├── Settings/
│ └── ...
└── theme/ # Material3 theme, colors, typography
Each screen follows the pattern: Screen.kt + ViewModel.kt + UiState.kt, with state exposed via StateFlow and collected as State in Compose.
- Auto-import transactions from Monobank
- Add a purchase you made with cash
- AI checks for unnecessary subscriptions and spending patterns
- Money-saving challenges with progress tracking
- Financial tips generated by AI using your transaction behavior
- Personal finance AI assistant chat (questions, tips, recommendations)
- NBU currency exchange rates in-app
- Savings statistics from completed challenges
- Finance lessons and questions as part of the literacy-focused product concept
- Local in-app currency (research mechanic) earned for achievements like:
- completing challenges/goals
- correct answers in lesson questions
- completing AI-generated educational video-related tasks
Note: some literacy/gamification mechanics above are part of the broader research concept and may evolve across iterations.
The AI layer is designed to run on the backend with Ollama + Gemma 4 locally, enabling:
- transaction-aware financial tips,
- personalized assistant chat,
- contextual financial guidance.
- Kotlin
- Jetpack Compose + Material 3
- Android Architecture Components (ViewModel, Lifecycle)
- Koin (dependency injection)
- OkHttp (+
okhttp-digest) - Kotlinx Serialization
- Kotlin Coroutines
- Android DataStore (Preferences)
- Firebase Cloud Messaging (FCM)
- Compose Navigation
- Compose Charts
- Gradle (Kotlin DSL)
- Android Gradle Plugin 9.x
- KSP
- GitHub Actions for CI (
buildandtestDebugworkflows)
- Android Studio (latest stable recommended)
- JDK 21 (JetBrains toolchain is configured in Gradle)
- Android SDK with emulator/device support
- Running Spendly backend locally
- Monobank API token
- Clone the repository.
- Open the project in Android Studio.
- Ensure Gradle sync completes.
- Start the backend locally on port
8080. - Run the app on an Android emulator/device.
- In the app, authorize with Monobank and provide your API token.
./gradlew clean testDebug
./gradlew clean buildContributions are welcome.
If you want to contribute:
- Fork the repository
- Create a feature branch
- Commit your changes
- Open a pull request with a clear description
Please keep changes focused, tested, and consistent with the current architecture.
This project is licensed under the Apache License 2.0.
See LICENSE for details.