Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save HekmatullahAmin/4e968cd7345d55968b0936ee617fef87 to your computer and use it in GitHub Desktop.

Select an option

Save HekmatullahAmin/4e968cd7345d55968b0936ee617fef87 to your computer and use it in GitHub Desktop.
GSoC 2025 Final Report — Contributions across Mifos mobile ecosystem

478660067-6b854ebf-1611-4ee9-bad9-493d700d73e8

Google Summer of Code 2025 – Contributions to Mifos Initiative

This repository documents my GSoC 2025 work with the Mifos Initiative, plus contributions before the official coding period.

GSoC 2025 Kotlin Multiplatform Compose Multiplatform CI/CD

LinkedIn   Medium   GitHub   Portfolio   Google Developers

My GSoC project focused on Making the Mobile Wallet Deployment-Ready for G2P and Merchant Use Cases, but my work extended across multiple repositories to enhance functionality, fix bugs, improve CI/CD, and contribute to the Kotlin Multiplatform ecosystem within Mifos.

Note

Accepted GSoC Proposal (Reference) If you’d like a concrete example of a strong proposal—structure, milestones, and visuals View my accepted GSoC 2025 proposal on Notion » (Notion may prompt you to sign in.)

Tip

Org-wide contributions (openMF)
Quickly browse everything I’ve merged across the organization:
All merged PRs by me »

Table of Contents

Mobile Wallet

Repo: openMF/mobile-wallet
About: A Kotlin Multiplatform (KMP) reference implementation of a digital wallet built on Apache Fineract. It supports Android, iOS, desktop, and web platforms using Compose Multiplatform, Ktor/Ktorfit, and Koin to deliver a clean architecture-based wallet with payment capabilities. Developed for both client and merchant use cases, this wallet is optimized for financial inclusion scenarios and aligned with open digital finance frameworks.

PR highlights

I productionized the app across platforms: set up end-to-end CI/CD with GitHub Actions and Fastlane to ship macOS/iOS builds to TestFlight and the App Store, added full App Store metadata, and tuned build logic (incl. JDK 21) for reliability and speed. I aligned the project with the KMP template, consolidated the network layer, and unified the UI on a shared KptMaterialTheme. On features/quality, I implemented complete Auth (Sign-In/Up), fixed key iOS navigation/crashes, improved transfer and sharing flows, added serializers, and created a Postman collection for API validation—moving the wallet toward a deployable, maintainable product.

🔗 View merged PRs » auto-updating

No. PR Description
1 #1911 Added a “macOS Build & Distribute (TestFlight / App Store)” GitHub Actions workflow; created Fastlane lanes (desktop_testflight, desktop_release); updated Compose Desktop config for App Store mode (entitlements, provisioning, un-quarantine step), bumped JVM/JDK to 21, adjusted build logic, and added iOS/macOS screenshot paths & assets.
2 #1905 Added complete Fastlane metadata (name, subtitle, description, URLs, categories, review info), age rating and privacy details JSON, and iPhone/iPad screenshots; updated CI workflow to read fastlane/metadata/ios.
3 #1904 Speed up CI by optimizing the slow cmp_shared build step.
4 #1901 Align Fastlane Fastfile and configs with the KMP project structure for smoother distribution.
5 #1900 Fix multiplatform targets (iOS, Desktop, JS) and update dependency versions.
6 #1898 Consolidate network layers (move core-base/network into core/network).
7 #1897 Replace MaterialTheme with KptMaterialTheme in feature layer (shared design system).
8 #1896 Replace MaterialTheme with KptMaterialTheme in core layer.
9 #1895 Sync missing root files/folders from the KMP project template.
10 #1894 Complete build-logic setup; add missing dependencies to the version catalog.
11 #1893 Rename modules from mifospay-* to cmp-* for consistency.
12 #1884 Implement iOS file sharing and improve Android share logic.
13 #1878 Fix iOS navigation & crashes; add TransferDate serializer; improve Beneficiary & Home screens.
14 #1877 Add Postman collection to validate self-service APIs for the wallet.
15 #1876 Fix crash on app open without internet after passcode entry.
16 #1875 Fix TransferDetail deserialization by changing transferDate type to String.
17 #1874 Improve Make Transfer account selection (BottomSheetScaffold refactor).
18 #1872 Auth: Implement full Sign-In & Sign-Up flows with validation.
19 #1867 Update testers group name for app distribution.

I successfully published the Mobile Wallet app on both the Mac App Store and the iOS App Store, and also made it available for internal testing via TestFlight.

Mac App Store iOS App Store TestFlight

Back To Top

Mifos Mobile

Repo: openMF/Mifos-mobile
About: A Kotlin Multiplatform client for end users, built on the MifosX Self-Service platform. It lets customers securely view and transact on their own accounts and loans. Compared to staff apps, data is a curated subset appropriate for self-service. Shared KMP modules power business logic across Android, iOS, Desktop, and Web, with Kotlin/Compose UIs providing a streamlined, consistent experience.

PR highlights

I pushed the app toward Kotlin Multiplatform by wiring cmp-shared, migrating core modules (model, database, about) and the entire Accounts feature (savings/loan/share) to Compose Multiplatform with a clearer multi-module structure. I improved UX (correct post-transfer navigation, dynamic account selection, decimal handling), cleaned up code, and tightened quality gates with Detekt configuration. I also enabled iOS build/distribution plumbing so the project can benefit from shared CI and testing.

🔗 View merged PRs » auto-updating

No. PR Description
1 #2844 Update testers group name for app distribution (CI).
2 #2823 Configure iOS project to connect cmp-shared (KMP enablement).
3 #2800 Fix post-transfer navigation: Users now return to the screen they started from—Home → Home, Savings Account → Savings, Loan Account → Loan—after a successful transfer. Improves consistency and UX.
4 #2799 Epic: Modularize Account feature. Created module scaffolding and Gradle configs for accounts (base), savings-account, loan-account, and share-account; wired dependencies (accounts depends on the others). Added KDoc, refactored/moved functions, renamed props for consistency, made the filter dialog dynamic (checkboxes from status), introduced card UI for account items, and organized module-specific strings. Tracks sub-work: #2774, #2775, #2776, #2773, #2778, #2782, #2781.
5 #2795 Improve dynamic account selection; add decimal support in transactions.
6 #2782 Remove feature/account module from CMP (cleanup).
7 #2781 Add missing imports; remove unnecessary properties in composables.
8 #2779 Accounts: Migrate feature:accounts to CMP.
9 #2778 Share Account: Complete CMP migration.
10 #2776 Share Account: Start module migration to CMP.
11 #2775 Loan Account: Migrate module to CMP.
12 #2774 Savings Account: Migrate module to CMP.
13 #2773 Set up initial directory structure for feature:account.
14 #2765 Configure & fix Detekt for KMP; enable Firebase upload for testing.
15 #2762 Update README and add Zoom link.
16 #2761 About: Migrate module to CMP.
17 #2759 Fix incorrect DataState import in datastore.
18 #2752 Database: Migrate module to KMP.
19 #2748 Prevent crash when opening Mifos license; tweak icon colors.
20 #2732 Model: Migrate module to KMP.
21 #2724 Fix visibility on Savings Account Withdraw screen.
22 #2721 Docs cleanup: remove outdated Notice section content.

Here’s a demo showing that I implemented Room Database for Android, iOS, and Desktop:

Android iOS Desktop

Back To Top

KMP Project Template

Repo: openMF/kmp-project-template
About: The ultimate Kotlin Multiplatform project generator with a production-ready setup.

  • Cross-Platform Support: Android, iOS, Desktop, and Web from a single codebase
  • Multi-Module Architecture: Clean, organized, and scalable structure
  • Advanced Source Set Hierarchy: Sophisticated sharing with logical platform groupings
  • Pre-configured CI/CD: GitHub Actions for build, test, and deployment
  • Code Quality Tools: Static analysis and formatting pre-wired
  • Sync Capabilities: Utilities to stay in sync with upstream template changes
  • Secrets Management: Secure handling of keystores and other sensitive artifacts

PR highlights

I evolved the template into a production-ready starter: added a reusable adaptive design system (Material 3 scaffolds for phone/tablet), a turnkey Ktorfit networking module with robust Result converters, and cross-platform theming (incl. Android dynamic color). On delivery, I overhauled iOS CI/CD (CocoaPods integration, release/TestFlight lanes, SSH-based Match), added privacy/metadata, and documented usage. I also expanded the module set (datastore, database, design system) and included functional samples to make new apps faster to scaffold and ship.

🔗 View merged PRs » auto-updating

No. PR Description
1 #85 iOS: Switch to CocoaPods integration for cmp-shared.
2 #78 Refactor Fastlane and CI workflows for more robust iOS distribution.
3 #77 Add TODO app use case to Home screen (sample).
4 #72 Adaptive Layouts (Design System): Added Material 3 adaptive scaffolds for phones/tablets — AdaptiveNavigableListDetailPaneScaffold, AdaptiveListDetailPaneScaffold, AdaptiveNavigableSupportingPaneScaffold, and AdaptiveNavigationSuiteScaffold. Encapsulates list–detail and supporting-pane patterns, window-size awareness, and ready-to-use examples.
5 #71 Update testers group name for distribution (CI).
6 #49 Theme Selection & Dynamic Colors (Android 12+): Cross-platform theme picker. On Android choose Default or Android, toggle Dynamic Colors (12+), and switch Light/Dark; iOS/Web/Desktop support Light/Dark toggle. Introduced reusable ThemeCard; used getPlatform & supportsDynamicTheming.
7 #70 Modularize Design System as a CMP UI library; add dynamic theming.
8 #62 Ktorfit Networking Module: Turn-key HttpClient config (setupDefaultHttpClient) with sensible defaults (timeouts, logging, auth, JSON) and overrides. Added ResultSuspendConverterFactory & ResultFlowConverterFactory for Result<Success, RemoteError> wrapping on suspend/Flow APIs—less boilerplate, unified error handling.
9 #61 Add missing App Store Connect metadata & privacy details.
10 #60 Create release lane for App Store; add metadata support.
11 #59 iOS CI/CD Overhaul: Migrated Fastlane Match to SSH (more reliable), reverted to automatic signing, and updated docs. Multi-Platform Build & Publish workflow can ship to Firebase, TestFlight, or both; integrated changes across shared actions/workflows.
12 #57 Revert accidental google-services.json commit.
13 #56 Rename workflow naming & versioning (consistency).
14 #55 Fix Firebase App Distribution failures in template.
15 #52 Fastlane lane for iOS Firebase releases.
16 #51 Update Fastlane version.
17 #48 Configure iOS project to connect cmp-shared.
18 #47 Add core-base/ to the sync workflow.
19 #46 Add core-base/datastore module.
20 #45 Add core/datastore module.
21 #43 Core-Base Database Module: Moved shared Room pieces to core-base/database; DatabaseFactory now returns RoomDatabase.Builder for per-app customization. Kept app-specific entities/DAOs in core/database; added expect/actual structure and Koin wiring.
22 #42 Add core/database module.

I created following adaptive layouts:

  • AdaptiveNavigableListDetailPaneScaffold
  • AdaptiveListDetailPaneScaffold
  • AdaptiveNavigableSupportingPaneScaffold
AdaptiveNavigableListDetailPaneScaffold AdaptiveListDetailPaneScaffold AdaptiveNavigableSupportingPaneScaffold

Back To Top

Android Client

Repo: openMF/android-client
About: A Kotlin Multiplatform application built on the MifosX core banking platform, designed for field officers to efficiently process transactions, manage client data, track center and group records, and handle accounts (loans, savings, recurring deposits). The goal is to streamline field operations with a shared cross-platform codebase (domain, data, networking), while delivering a polished Android experience and paving the way for additional platforms.

A standout capability is robust offline support, enabling officers to work in remote areas and sync when connectivity returns—so underserved clients can still access essential financial services.

PR highlights

I kept the app’s release pipeline consistent and unblocked by aligning tester group naming and distribution configs across workflows. While small in scope, these CI tweaks remove friction for automated builds and make the client ready to plug into the org-wide reusable workflows.

🔗 View merged PRs » auto-updating

No. PR Description
1 #2378 Update testers group name used for app distribution (CI).
2 #2376 Same CI update across workflows to keep distribution groups consistent.

Back To Top

Mifos Passcode CMP

Repo: openMF/mifos-passcode-cmp
About: A Kotlin Multiplatform library providing secure passcode functionality for Mifos applications. It supports Android, iOS, and desktop apps and enforces passcode lock on resume or inactivity. Released under Apache 2.0, it improves app security and UX consistency across platforms.

PR highlights

I extended the library to fully support iOS and added optional biometric authentication (Face ID / Touch ID) with a safe fallback to the existing passcode flow. The module now builds cleanly for iOS alongside Android/Desktop, so apps can enforce lock-on-resume/inactivity across platforms with a consistent API and UX.

🔗 View merged PRs » auto-updating

No. PR Description
1 #42 Implement biometric authentication support for iOS.
2 #41 Add iOS build support for the CMP module.

In addition to passcode, I implemented biometric authentication (Face ID / Touch ID) support for iOS.

Biometric Authentication

Back To Top

CI/CD – GitHub Actions & Reusable Workflows

Repos:
openMF/mifos-x-actionhub · openMF/mifos-x-actionhub-build-ios-app · openMF/mifos-x-actionhub-publish-ios-on-firebase · openMF/mifos-x-actionhub-publish-ios-on-appstore-testflight · openMF/mifos-x-actionhub-publish-ios-on-appstore
About: A suite of reusable GitHub Actions and workflows that standardize iOS/KMP delivery across Mifos projects: building signed/unsigned iOS apps, distributing to Firebase App Distribution, and publishing to TestFlight/App Store — with improved reliability via SSH-based Fastlane Match, clear inputs, and comprehensive documentation. These actions are used by the KMP template and app repos to keep release pipelines consistent and repeatable.

PR highlights

I built and refined a suite of reusable actions that standardize iOS/KMP delivery across Mifos projects: building signed/unsigned apps, and publishing to Firebase App Distribution, TestFlight, and the App Store. Key work included migrating signing to SSH-based Match for reliability, adding flexible inputs (CocoaPods / shared module configuration, Gradle props), creating App Store and TestFlight lanes, hardening builds (precreating resource paths), and writing clear documentation. Net result: projects can adopt single-line, repeatable pipelines for iOS/KMP releases.

🔗 All my merged PRs (auto-updating)

No. PR Repo Description
1 #37 mifos-x-actionhub CI: create Compose resources directory path before build (prevents missing-path failures).
2 #36 mifos-x-actionhub Add ci_gradle_properties_path support + README updates for flexible Gradle props.
3 #35 mifos-x-actionhub CocoaPods-based iOS integration: add use_cocoapods and shared_module inputs.
4 #8 build-ios-app Docs: add Fastlane configuration and usage guidance.
5 #33 mifos-x-actionhub Update iOS workflows to latest Fastlane actions; sync documentation.
6 #5 publish-ios-on-firebase Add App Store Connect inputs to Firebase distribution action; README updates.
7 #7 build-ios-app Support both signed Release and Debug iOS builds in the action.
8 #32 mifos-x-actionhub Add Fastlane lane for App Store deploy; update repo README.
9 #1 publish-ios-on-appstore New action: publish iOS app to App Store via Fastlane + App Store Connect API.
10 #31 mifos-x-actionhub Refactor CI to SSH-based Match and split Firebase / TestFlight deploy logic.
11 #6 build-ios-app Switch Match from HTTPS token to SSH for signing repo access in CI.
12 #4 publish-ios-on-firebase Add SSH support and configuration in Firebase iOS publish action.
13 #4 publish-ios-on-testflight Add SSH + extended config support for TestFlight deploy action.
14 #28 mifos-x-actionhub Bump iOS build action to v1.0.1; add extra iOS inputs.
15 #5 build-ios-app README improvements/clarifications.
16 #3 build-ios-app Pass Match and build parameters via inputs (more reusable).
17 #27 mifos-x-actionhub Add MATCH_GIT_BASIC_AUTHORIZATION env var for Git authentication.
18 #3 publish-ios-on-testflight README updates for TestFlight action.
19 #1 publish-ios-on-testflight CI: build and upload iOS app to TestFlight workflow.

Back To Top

Conclusion

This summer pushed me to grow on both the technical and human sides of software. On the hard-skills front, I shipped real, production workflows: Kotlin Multiplatform (KMP) across Android, iOS, Desktop, and Web; Compose Multiplatform UI with adaptive layouts; Room-backed data layers; and release engineering with Fastlane + GitHub Actions to deliver to Firebase, TestFlight, the App Store, and the Mac App Store. I tightened build logic, provisioning, and signing; moved projects toward cleaner modular architecture; and standardized networking and theming so features could scale. In short, I learned how to take features from “it works on my machine” to “it ships reproducibly for users.”

One of the most valuable parts of this experience was learning to work as part of a distributed team: joining daily stand-ups, openly sharing blockers and wins, and turning feedback into next steps. I practiced clear communication in PRs and reviews, wrote concise docs, and learned to negotiate scope, set priorities, and own outcomes—not just code. The skills I’ve gained in communication, time management, and remote collaboration will undoubtedly serve me well in my future endeavors.

I hope to remain involved with the project and the open-source community, contributing to its ongoing development and success and helping new contributors ramp up. Huge thanks to Mifos, Google Summer of Code (GSoC), and especially my mentor Rajan Maurya for the guidance, trust, and fast feedback loops that made this possible. If you’re a future GSoC contributor, this is a fantastic place to learn how real products ship; and if you’re an employer, this work reflects what I love doing: building cross-platform features end-to-end, hardening CI/CD, and collaborating with teams to deliver reliable software.

In addition to feature work, I actively reviewed PRs to help maintain consistency and quality across the ecosystem. Browse my reviews here:

Back To Top

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment