Loading repository data…
Loading repository data…
MuhammadFaheemAkram / repository
SpendWise — A modern personal finance tracker built with Kotlin, Jetpack Compose, MVVM, Hilt, Coroutines, Flow, Room, and DataStore. Features expense tracking, budgets, accounts, analytics, reports, offline-first architecture, testing, and clean Android app design using modern development practices.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
SpendWise is an open-source Android personal finance tracker built as a portfolio-quality sample app. It demonstrates modern Android engineering with Kotlin, Jetpack Compose, Material 3, MVVM, clean architecture-inspired layering, Hilt, Coroutines, Flow, StateFlow, Room, DataStore Preferences, a fake Retrofit-style API layer, WorkManager simulation, and automated tests.
The app uses local storage as the source of truth and ships with demo finance data so it can run without a backend.
The seven planned implementation phases are complete. SpendWise is a working portfolio sample with offline data, CRUD flows, reports, recurring reminders, persisted settings, tests, CI, and learning documentation. Planned extensions are listed in the roadmap rather than presented as existing features.
StateFlow UI stateSpendWise includes these top-level and detail experiences:
Screenshots are tracked in docs/SCREENSHOTS.md.
SpendWise follows a clean MVVM-style architecture. Composables are mostly stateless, ViewModels expose immutable StateFlow, UI events are sent through ViewModel functions, use cases contain business operations, repositories hide local and fake remote data sources, and mappers convert between DTO, entity, domain, and UI models.
Compose UI
|
ViewModel
|
UseCase
|
Domain repository interface
|
Data repository implementation
|
Room database + DataStore + FakeFinanceApiService
More detail is available in docs/ARCHITECTURE.md.
co.bitfuse.spendwise/
SpendWiseApp.kt
MainActivity.kt
core/
database/
datastore/
designsystem/
navigation/
network/
data/
account/
budget/
category/
mapper/
recurring/
repository/
settings/
transaction/
domain/
model/
repository/
usecase/
feature/
accounts/
addtransaction/
budgets/
categories/
dashboard/
recurring/
reports/
settings/
transactiondetail/
transactions/
di/
app run configuration.Terminal commands:
./gradlew :app:assembleDebug
./gradlew :app:installDebug
The fake network layer lives in core/network. FinanceApiService defines Retrofit-style suspend functions and FakeFinanceApiService returns hard-coded demo responses after an artificial delay. Error simulation is available through simulateErrors, disabled by default.
The app can later replace FakeFinanceApiService with a real Retrofit implementation while keeping repository and domain contracts stable.
Room is the app source of truth for transactions, categories, accounts, budgets, and recurring transactions. Repository refresh methods fetch fake remote data and write it locally. UI observes Room-backed flows, so screens update when local data changes.
Settings are stored separately in DataStore Preferences. Dark mode is observed at the app root and applied through the Compose theme.
See docs/DATA_MODEL.md.
Tests are organized by layer:
Run checks from the terminal:
./gradlew :app:assembleDebug
./gradlew :app:testDebugUnitTest
./gradlew :app:assembleDebugAndroidTest
./gradlew :app:connectedDebugAndroidTest
./gradlew :app:lintDebug
See docs/TESTING.md.
See docs/ROADMAP.md.
Contributions are welcome. Read CONTRIBUTING.md, CODE_OF_CONDUCT.md, and SECURITY.md before opening an issue or pull request.
SpendWise is available under the MIT License.