馃殌 The Vision: MMEX Android V2
The current Android codebase has served us well over the years, but it's built on older technologies (XML layouts, legacy patterns) that make adding new features, maintaining the app, and achieving high performance increasingly difficult.
It鈥檚 time for a major leap forward. I am proposing (and starting) a complete rewrite of the MMEX Android app from scratch, targeting a fully modern Android stack.
Video
馃彈 Architectural Guidelines & Tech Stack
To ensure this rewrite is sustainable, highly testable, and ready for future integrations (like MMX Sync / PocketBase syncing), we are adopting strict architectural rules.
Core Stack:
- Language: 100% Kotlin (idiomatic, using sealed classes and scope functions).
- UI Toolkit: Jetpack Compose + Material Design 3. (No XML, Fragments, or RecyclerViews).
- Asynchronous Programming: Kotlin Coroutines & Flow (
StateFlow / SharedFlow).
- Dependency Injection: Hilt.
- Database: Room (with KSP).
Clean Architecture Structure:
We are strictly separating concerns into three layers:
domain: The core of the app. Pure Kotlin models (DTOs) and Use Cases. No Android or database dependencies.
data: The only layer aware of Room and external sources. It maps our legacy database into clean domain models via Mappers.
presentation: Jetpack Compose UI and ViewModels (MVVM/MVI pattern). UI components must be stateless, and state is hoisted via StateFlow.
馃洝 The Legacy Database Rule
The existing SQLite desktop database schema is strictly untouchable. To maintain 100% compatibility with the desktop version of Money Manager Ex, we cannot alter the tables.
- Room will be configured using
createFromFile() to hook into the existing .db.
- We will use Room
@Entity and @ColumnInfo to map the legacy naming conventions, but these entities must never leak into the presentation or domain layers. They will be immediately mapped to clean Domain Models.
馃洡 Execution Strategy: The Strangler Fig Pattern
To avoid breaking the current app and to keep the repository stable, we are not refactoring "in place".
- New Module: All new code will live in a completely isolated module called
:app_v2.
- Vertical Slices: We will not build horizontal layers (e.g., "all DAOs first"). We will develop feature by feature (Vertical Slices): Database -> Mapper -> UseCase -> ViewModel -> Compose UI.
- Phase 1 (Read-Only MVP): The first milestone is building a read-only MVP (Homepage Dashboard, Accounts list, and Transactions) to validate the Room integration and the new Compose UI without risking data corruption.
馃 Feedback & Contributions
This is a massive undertaking, but the result will be a lightning-fast, beautiful, and easily maintainable app.
I'd love to hear feedback from the community on this architectural approach. If anyone wants to jump in, let's coordinate in the comments below to assign specific vertical slices!
screen preview

馃殌 The Vision: MMEX Android V2
The current Android codebase has served us well over the years, but it's built on older technologies (XML layouts, legacy patterns) that make adding new features, maintaining the app, and achieving high performance increasingly difficult.
It鈥檚 time for a major leap forward. I am proposing (and starting) a complete rewrite of the MMEX Android app from scratch, targeting a fully modern Android stack.
Video
馃彈 Architectural Guidelines & Tech Stack
To ensure this rewrite is sustainable, highly testable, and ready for future integrations (like MMX Sync / PocketBase syncing), we are adopting strict architectural rules.
Core Stack:
StateFlow/SharedFlow).Clean Architecture Structure:
We are strictly separating concerns into three layers:
domain: The core of the app. Pure Kotlin models (DTOs) and Use Cases. No Android or database dependencies.data: The only layer aware of Room and external sources. It maps our legacy database into clean domain models via Mappers.presentation: Jetpack Compose UI and ViewModels (MVVM/MVI pattern). UI components must be stateless, and state is hoisted viaStateFlow.馃洝 The Legacy Database Rule
The existing SQLite desktop database schema is strictly untouchable. To maintain 100% compatibility with the desktop version of Money Manager Ex, we cannot alter the tables.
createFromFile()to hook into the existing.db.@Entityand@ColumnInfoto map the legacy naming conventions, but these entities must never leak into thepresentationordomainlayers. They will be immediately mapped to clean Domain Models.馃洡 Execution Strategy: The Strangler Fig Pattern
To avoid breaking the current app and to keep the repository stable, we are not refactoring "in place".
:app_v2.馃 Feedback & Contributions
This is a massive undertaking, but the result will be a lightning-fast, beautiful, and easily maintainable app.
I'd love to hear feedback from the community on this architectural approach. If anyone wants to jump in, let's coordinate in the comments below to assign specific vertical slices!
screen preview