Offline-first personal finance manager, encrypted at rest and with a home-screen widget.
FinFlow tracks income and expenses while working 100% offline. You log transactions by category, see your balance and trends in charts drawn with Canvas, and check the month's summary from a widget without opening the app. The local database is the single source of truth —there's no backend— and, since it's about money, it's encrypted at rest and protected with biometrics.
| 🔒 Real privacy | Your finances never leave the device. Local DB encrypted with SQLCipher; the passphrase lives in the Android Keystore. |
| ⚡ Always works | Offline-first: zero loading screens, zero network errors. The UI reacts instantly thanks to Room + Flow. |
| 📊 Clear picture | Monthly balance, spending by category (donut) and month-over-month trend (bars), all in Canvas for a lightweight APK. |
| 🏠 Present beyond the app | A Glance widget and WorkManager reminders so you never forget to log an expense. |
In one sentence: keep control of your money in a way that's private, fast, and free of any internet or server dependency.
| Layer | Technologies |
|---|---|
| Language & UI | Kotlin · Jetpack Compose (Material 3 + dynamic color) · Navigation 3 · Canvas for charts (no charting libs) |
| Architecture | Lightweight Clean Architecture (domain / data / ui) · MVI (one immutable state per screen) · Coroutines + Flow / StateFlow · Hilt |
| Data & security | Room (+ KSP) as the SSOT with Flow DAOs · SQLCipher · Android Keystore / security-crypto · androidx.biometric · DataStore |
| System | Jetpack Glance (widget) · WorkManager (reminders and deferred tasks) |
| Quality & tests | JUnit · MockK · Turbine · coroutines-test · Roborazzi · ktlint · detekt · Android Lint |
Requirements: JDK 11 · Android Studio (AGP
9.2.1) ·compileSdk 37·targetSdk 36·minSdk 26. All versions live in the Version Catalog (gradle/libs.versions.toml).
| Action | Command |
|---|---|
| Build (debug) | ./gradlew assembleDebug |
| Install on device | ./gradlew installDebug |
| Release build | ./gradlew assembleRelease |
| Format (ktlint) | ./gradlew ktlintFormat |
| Quality (lint + ktlint + detekt) | ./gradlew codeQuality |
| Format + verify everything ⭐ | ./gradlew formatAndAnalyze |
| Unit tests (JVM) | ./gradlew test |
| Instrumented tests | ./gradlew connectedAndroidTest |
💡 Before every commit:
./gradlew formatAndAnalyze.
FinFlow/
├── app/src/main/java/com/hacybeyker/finflow/
│ ├── domain/ # Entities, use cases and repository interfaces (pure Kotlin)
│ ├── data/ # Room, DAOs, mappers and repository implementations
│ └── ui/ # Compose screens, ViewModels (MVI) and theme
├── config/detekt/ # detekt configuration
├── gradle/libs.versions.toml # Version Catalog (dependencies SSOT)
├── lint.xml · .editorconfig # Lint rules and code style
├── CHANGELOG.md # Version history
├── DESIGN.md # Design system (colors, typography, spacing, components)
└── AGENTS.md # Standards and guide for AI assistants
The architecture, SOLID standards, MVI patterns and implementation rules live in AGENTS.md, and the visual design system (colors, typography, spacing, components, light/dark) in DESIGN.md — read both before touching any code (human or AI).
In short: ktlint android_studio style, max_line_length = 120, 4-space indentation, no wildcard imports or trailing commas, dependencies always via the Version Catalog, and UI built only from design tokens (MaterialTheme.*). Keep formatAndAnalyze and the tests green, and update the CHANGELOG.md.
Distributed under the MIT license — see LICENSE.
Copyright © 2026 Carlos Osorio (hacybeyker).