Avanzo (Italian for leftover) lets you log what's sitting in your fridge, set reminders before food expires, and reduce waste — on both Android and iOS, from a single shared codebase.
Coming soon
Avanzo is built with MVI (Model–View–Intent), keeping the UI fully driven by a unidirectional data flow:
User Intent → ViewModel → StateFlow → Composable UI
- State is a single immutable data class exposed as a
StateFlow - Intents are sealed classes representing every possible user action
- Side effects are handled via a separate
SharedFlowchannel - The UI never mutates state directly — it only emits intents
This makes the app highly predictable and easy to test.
State management is built entirely on Kotlin Flow:
| Concept | Implementation |
|---|---|
| UI state | StateFlow<ScreenState> in the ViewModel |
| One-off events | SharedFlow<SideEffect> |
| Collecting in UI | collectAsState() in Compose |
| Async operations | viewModelScope + coroutines |
| Layer | Technology |
|---|---|
| UI | Compose Multiplatform |
| State management | Kotlin Flow / StateFlow |
| Architecture | MVI |
| Shared logic | Kotlin Multiplatform (KMP) |
| Platforms | Android, iOS |
avanzo-compose-multiplatform/
├── composeApp/
│ └── src/
│ ├── commonMain/ # Shared UI, ViewModels, business logic
│ ├── androidMain/ # Android-specific entry points
│ └── iosMain/ # iOS-specific entry points
└── iosApp/ # iOS app shell (SwiftUI entry point)
- Android Studio Hedgehog or later
- Xcode 15+ (for iOS)
- JDK 17+
./gradlew :composeApp:installDebugOpen iosApp/iosApp.xcodeproj in Xcode and run on a simulator or device.
Giuseppe Falcone — Freelance Mobile Developer
LinkedIn · Milan, Italy