A production-grade Android application for discovering, analysing, and tracking mutual funds — built with modern Kotlin and Jetpack Compose.
| Explore | Empty State | FundDetail | AddToWatchList |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| View All | Watchlist | Search | EmptyPortfolio |
![]() |
![]() |
![]() |
![]() |
- Explore Screen — Curated discovery across 4 fund categories: Index, Bluechip, Tax Saver (ELSS), and Large Cap
- Fund Detail Screen — AMC info, scheme type, latest NAV, and an interactive NAV history line chart
- Watchlist Management — Create and manage multiple custom watchlist folders with persistent local storage
- Infinite Scroll View All — Lazy-loaded list of all funds in a category with smooth performance
- Fund Search — Real-time search with 300ms debounce to minimise unnecessary API calls
- Add to Watchlist BottomSheet — Select multiple folders or create a new one directly from the product screen
- Offline Support — Explore screen data is cached locally; app shows stale data gracefully when offline
- Empty States — Illustrated, descriptive empty states across all screens
- Light / Dark Theme — Dynamic theme switching with full system support
- Loading / Error States — Explicit UI states for every async operation
The project follows MVVM + Clean Architecture, with a clear separation of concerns across three layers:
com.imgurujeet.mfet/
│
├── data/
│ ├── local/ # Room database — entities, DAOs, database class
│ ├── mapper/ # Data ↔ domain model mappers
│ ├── remote/ # Retrofit API service + response DTOs
│ └── repository/ # Repository implementations
│
├── di/ # Koin modules (network, database, repository bindings)
│
├── domain/
│ ├── model/ # Pure Kotlin domain models
│ ├── repository/ # Repository interfaces
│ └── usecase/ # Use cases (one action per class)
│
├── ui/
│ ├── common/ # Shared utilities, extensions, base classes
│ ├── components/ # Reusable Composables (charts, cards, loaders)
│ ├── explore/ # Explore screen — ViewModel + Composables
│ ├── navigation/ # Compose navigation graph & routes
│ ├── product/ # Fund detail screen — ViewModel + Composables
│ ├── search/ # Search screen — ViewModel + Composables
│ ├── theme/ # Material 3 theme, typography, colour tokens
│ ├── viewall/ # View All screen — ViewModel + Composables
│ ├── watchlist/ # Watchlist screen — ViewModel + Composables
│ ├── MainActivity # Single activity host
│ └── MyApp # Application class (Koin initialisation)
│
└── res/ # Drawables, strings, fonts
UI (Composable)
↕ State / Events
ViewModel (StateFlow)
↕ Use Cases
Repository (Interface)
↕
Repository Impl ─── Remote (Retrofit + MFAPI)
└── Local (Room)
| Category | Library | Purpose |
|---|---|---|
| UI | Jetpack Compose + Material 3 | Declarative UI, theming |
| Architecture | ViewModel + StateFlow | MVVM state management |
| DI | Koin | Dependency injection |
| Networking | Retrofit + OkHttp + Gson | REST API calls to mfapi.in |
| Local DB | Room | Persistent watchlist storage |
| Caching | Room / local storage | Explore screen offline cache |
| Charts | Vico (or MPAndroidChart) | NAV history line chart |
| Navigation | Compose Navigation | Type-safe screen navigation |
| Coroutines | Kotlin Coroutines + Flow | Async / reactive data streams |
All data is sourced from the free MFAPI endpoint.
| Endpoint | Usage |
|---|---|
GET /mf/search?q={query} |
Populate Explore categories (e.g. q=index, q=bluechip, q=tax, q=large cap) |
GET /mf/{scheme_code} |
Fetch fund details + full NAV history |
Note on Explore screen data: Since mfapi.in has no category endpoint, each category is populated by querying the Search API with a relevant keyword (e.g.
q=index,q=bluechip). Results are cached locally so the Explore screen can show the last known data when offline.
- Android Studio Hedgehog or later
- JDK 17+
- Android SDK 26+
# 1. Clone the repository
git clone https://github.com/imgurujeet/MFET.git
# 2. Open in Android Studio
# File → Open → Select the MFET folder
# 3. Let Gradle sync complete
# 4. Run on emulator or physical device
# Run → Run 'app'No API keys required — MFAPI is completely free and open.
⬇️ Download app-release.apk (v1.0)
Enable Install from unknown sources in your device settings, then open the downloaded APK.
NAV chart — Uses a limited set of data instead of full history to keep the chart responsive, with options like 1M, 6M, 1Y, and All.
Watchlist state — Bookmark icon is connected to Room via StateFlow, so it updates automatically.
Scrolling — Uses LazyColumn for efficient rendering of lists.
Content-aware scroll — Some UI elements adjust based on scroll to give more space to content.







