Page MenuHomePhabricator

[GSoC Proposal] Modularization and Incremental Jetpack Compose Migration for the Commons Android App
Closed, DeclinedPublic

Assigned To
Authored By
VoidRaven-18
Mar 22 2026, 12:42 PM
Referenced Files
F73862656: image.png
Mar 27 2026, 8:53 PM
F73533555: image.png
Mar 23 2026, 6:21 PM
F73434683: COMPOSE INTEGRATION.png
Mar 22 2026, 12:42 PM
F73434654: MIGRATION STRATEGY.png
Mar 22 2026, 12:42 PM
F73434632: DATA FLOW.png
Mar 22 2026, 12:42 PM
F73434599: FEATURE MODULE STRUCTURE.png
Mar 22 2026, 12:42 PM
F73434559: MODULAR ARCHITECTURE.png
Mar 22 2026, 12:42 PM

Description

Name: Jagadeeshwar Reddy Kota
Email: kota.jagadesh123@gmail.com
GitHub: https://github.com/kota-jagadeesh
LinkedIn: https://linkedin.com/in/jagadeeshwar-reddy-kota
Country: India
Preferred Time Zone: Indian Standard Time (IST, UTC +5:30)
University: Amrita Vishwa Vidyapeetham
Course: Bachelor of Technology in Artificial Intelligence & Data Science
Availability for Google Summer of Code: Full-time (42+ hours per week)

Synopsis

App

Wikimedia Commons is an Android application developed by the Wikimedia Foundation that enables users to browse, upload, and contribute media directly to the Wikimedia Commons repository using their mobile devices. Users can easily select images from their device gallery or capture photos using the camera and upload them to the platform. The app aims to simplify the media contribution workflow and make it easier for contributors to share freely licensed images with the Wikimedia ecosystem.

Project

This project aims to modernize the architecture of the Wikimedia Commons Android App by introducing a modular, scalable, and maintainable codebase, along with the gradual adoption of modern Android UI development using Jetpack Compose. The goal is to transform the current monolithic structure into a well-organized multi-module architecture that improves maintainability, reduces technical debt, and enables faster and safer feature development.

Over time, the Commons Android App has evolved to include multiple complex features such as media uploads, browsing, location-based contributions, user profiles, and background processing workflows. However, this growth has resulted in a tightly coupled architecture where different components are interdependent, making it difficult to introduce changes, debug issues, or scale the application efficiently. Additionally, the current UI is primarily based on legacy XML layouts, which increases development overhead and limits flexibility compared to modern declarative UI approaches.

Through my prior contributions to the Commons Android App, I have worked on multiple areas including upload workflows, UI improvements, and bug fixes related to lifecycle handling and state management. These experiences have provided me with practical insight into the challenges of the existing architecture, such as state inconsistencies during configuration changes, tightly coupled components, and difficulty in isolating features for independent development. Based on this understanding, the project focuses on introducing a structured and incremental migration strategy rather than a complete rewrite.

A key design principle of this project is incremental and safe modernization. Instead of rewriting the entire application at once, the project will adopt a phased approach where individual features are extracted into independent modules, refactored using modern architectural patterns, and reintegrated into the application without disrupting existing functionality. This ensures stability while progressively improving the codebase.

Core Deliverables

To achieve this, the project will deliver the following core improvements:

Deliverable 1: Modular Architecture with Core and Feature Modules
The project will introduce a multi-module architecture by separating the application into core modules and feature modules. Core modules will include shared functionalities such as networking, database access, dependency injection, utilities, and UI components. Feature modules such as authentication, onboarding, profile, contributions, and file selection will be developed as independent units with clear boundaries.

This modularization will reduce coupling between components, enable independent development and testing of features, and significantly improve the maintainability and scalability of the application.

To prevent circular dependencies, feature modules will not depend on each other directly. All shared dependencies will be accessed through core modules, and inter-feature communication will be handled via the app module or well-defined interfaces. This ensures clear module boundaries and maintainable dependency graphs.

Additionally, modularization improves build performance by enabling parallel compilation and reducing build times for isolated changes.

Deliverable 2: Incremental Migration to Modern Android Architecture (MVVM)
Each feature module will be refactored using a clean architecture approach based on the Model-View-ViewModel (MVVM) pattern. This includes clear separation of concerns through data, domain, and UI layers, along with the introduction of repository patterns for managing data flow.

Instead of performing a large-scale rewrite, the migration will follow a structured “extract → refactor → integrate” approach, ensuring that existing functionality remains stable while gradually improving code quality and structure.

Deliverable 3: Gradual Adoption of Jetpack Compose
The project will introduce Jetpack Compose for building modern, declarative UI components. Rather than replacing all XML-based layouts at once, Compose will be adopted incrementally, starting with simpler screens such as onboarding and progressively extending to more complex interfaces.

This approach ensures compatibility with the existing UI while enabling the application to move towards a more flexible and maintainable UI system. A shared design system will also be introduced to maintain consistency across components.

Deliverable 4: Incremental Migration from RxJava to Kotlin Coroutines and Flow
The project will modernize asynchronous data handling by gradually replacing RxJava with Kotlin Coroutines and Flow within the modules being refactored. This migration will be performed incrementally to avoid introducing instability in the application.

By adopting Flow, the project will improve readability, lifecycle awareness, and state management, while also reducing method count and overall app size compared to RxJava. Additionally, Flow integrates seamlessly with Jetpack Compose through APIs such as collectAsStateWithLifecycle(), enabling more efficient and lifecycle-aware UI updates.

Deliverable 5: Improved Stability and Performance through Structured Refactoring
By modularizing the application and restructuring feature implementations, the project will also address existing issues such as crashes, ANRs (Application Not Responding errors), and state inconsistencies. Modules such as Auth and Contributions are prioritized due to known ANRs, crashes, and stability issues observed in these areas. Addressing these modules early will help improve reliability while validating the modularization approach on critical parts of the application.

By integrating these improvements into the Commons Android App, the project will establish a modern, scalable foundation that supports future development and encourages new contributors to engage with the codebase. This structured approach reduces technical debt, improves code clarity, and ensures that the application can evolve efficiently in the long term.

Issue Links

Possible Mentor(s)

Have you contacted the mentors already?
Yes

Technical Approach

This project focuses on transforming the Wikimedia Commons Android App from a monolithic architecture into a modular, scalable, and maintainable system, while incrementally adopting modern Android development practices such as Jetpack Compose and Kotlin Flow. The implementation will follow a structured and incremental approach to ensure stability and avoid introducing regressions.

1. Modular Architecture Design

The current application is structured as a single module with feature-based packages, leading to tight coupling and difficulty in isolating functionality. To address this, the project will introduce a multi-module architecture consisting of core modules and feature modules.

1.1 Core Modules

Core modules will contain shared functionalities that are used across multiple features. These modules will act as the foundation for all feature modules.

The following core modules will be introduced:

MODULAR ARCHITECTURE.png (5,594×1,255 px, 486 KB)

  • core-network: Handles API communication, including Retrofit configuration, API interfaces, and network utilities.
  • core-database: Manages local data storage, including Room database and data access objects.
  • core-di: Contains dependency injection setup using Dagger, providing shared dependencies across modules.
  • core-utils: Includes utility classes such as logging, concurrency helpers, and common extensions.
  • core-ui: Defines the design system, including themes, typography, colors, and reusable UI components such as buttons (primary/secondary), text components, input fields, loaders, error states, and dialog components.
  • core-domain: Contains shared business logic, use cases, and repository interfaces used across feature modules.

Additionally, a build-logic module will be introduced to centralize dependency management and Gradle configurations using convention plugins. This ensures consistency across modules and simplifies dependency updates.

1.2 Feature Modules

Feature modules will encapsulate specific functionalities and will be independently developed and tested. Each feature module will follow a consistent internal structure:

FEATURE MODULE STRUCTURE.png (2,346×1,730 px, 184 KB)

Current structure:
app/src/main/java/fr/free/nrw/commons/auth/

Proposed modular structure:
feature-auth/
├── data/
├── ui/

The following feature modules will be prioritized:

  • Auth Module: Login, signup, and session management.
  • Welcome Module: Onboarding and initial user flow.
  • Profile Module: User profile, achievements, and leaderboard.
  • Contributions Module: User uploads and contribution tracking.
  • FilePicker Module: Media selection and file handling (custom selector used in upload workflow).
  • Explore Module (includes Nearby functionality): Map-based exploration and location-driven media browsing.

Additional modules such as settings, notifications, location, and feedback will be modularized if time permits.

2. Architecture Pattern

Each feature module will follow the Model-View-ViewModel (MVVM) architecture with a clean separation of concerns:

  • UI Layer: Composable screens and UI logic.
  • Domain Layer: Business logic and use cases will be placed in a shared core:domain module rather than inside each feature module. This ensures that use cases act as a single source of truth and can be reused across multiple feature modules, avoiding duplication and unnecessary complexity.
  • Data Layer: Repository implementations and data sources.

The data flow will follow:

DATA FLOW.png (3,747×780 px, 134 KB)

UI → ViewModel → UseCase → Repository → Data Source (API/DB)

This separation ensures improved testability, maintainability, and scalability.

3. Migration Strategy (Incremental Refactoring)

A key principle of this project is incremental migration rather than a full rewrite.

The migration will follow a structured approach:

MIGRATION STRATEGY.png (3,759×305 px, 69 KB)

  1. Extract: Extract existing feature logic into a new module.
  2. Refactor: Reorganize code into data, domain, and UI layers using MVVM.
  3. Integrate: Integrate the refactored module back into the main application while preserving existing functionality.
  4. Stabilize: Test functionality and fix regressions.

This approach ensures that the main application remains functional throughout the migration process and reduces the risk of introducing breaking changes.

4. Jetpack Compose Integration Strategy

Modern UI development will be introduced using Jetpack Compose.

Instead of replacing all XML layouts at once, Compose will be adopted incrementally:

COMPOSE INTEGRATION.png (941×1,730 px, 89 KB)

  • Begin with simple screens (e.g., onboarding).
  • Introduce reusable composable components in the core-ui module.
  • Use interoperability (ComposeView) to integrate Compose with existing XML-based screens.
  • Gradually migrate selected screens in feature modules.

A full UI redesign is not within the scope of this project; instead, the focus is on modernizing UI implementation while maintaining functional consistency.

5. Asynchronous Data Handling (RxJava → Flow)

The current codebase uses RxJava for asynchronous operations. As RxJava is now less preferred in modern Android development, the project will introduce Kotlin Coroutines and Flow.

Key principles:

  • Migration will be incremental, limited to refactored modules.
  • Existing RxJava code will not be aggressively removed from untouched modules.
  • Flow will be used for:
    • UI state management
    • Asynchronous data streams
    • Lifecycle-aware operations

This ensures a smooth transition without destabilizing the application.

6. Dependency Injection Strategy

The project will continue using Dagger for dependency injection, as it is already integrated into the codebase.

  • Shared dependencies will be moved to the core-di module.
  • Feature modules will define their own scoped dependencies where necessary.
  • Dependency graphs will be structured to avoid circular dependencies between modules.

Future migration to Hilt can be explored but is not included within the scope of this project.

7. Navigation Strategy

The project will maintain compatibility with the existing navigation system while gradually introducing improvements:

  • Existing fragment-based navigation will remain functional.
  • New Compose screens will be integrated using interoperability.
  • Navigation will initially remain fragment-based to ensure stability. Compose-based screens will be integrated using ComposeView alongside existing XML layouts.A complete migration to a Compose navigation system is considered out of scope for this project. However, all newly modularized features will be designed to be navigation-agnostic, ensuring that future migration to Compose Navigation can be performed smoothly without major refactoring.

8. Performance and Stability Improvements

By restructuring the application, the project will also address stability issues such as ANRs and crashes identified in modules like authentication and contributions.

Improvements include:

  • Eliminating blocking calls on the main thread
  • Improving lifecycle-aware state handling
  • Reducing unnecessary coupling between components
  • Isolating feature-specific logic to prevent cross-module regressions

9. Testing Strategy

To ensure reliability, the project will include:

  • Unit tests for ViewModels and domain logic
  • Integration testing for feature modules
  • Testing will be introduced incrementally alongside module extraction and refactoring, following a lightweight TDD approach where feasible.
  • Core modules will be mocked during testing to ensure feature modules can be tested independently.
  • Gradual improvement of test coverage as modules are refactored

Testing flow will follow the same architecture (UI -> ViewModel -> UseCase -> Repository), with core layers mocked for isolation.

Implementation Plan

This project will be executed in a structured, phase-wise manner, focusing on incremental modularization, safe migration, and gradual adoption of modern Android practices. The implementation is designed to ensure stability while progressively improving the architecture of the application.

Phase 1: Foundation Setup and First Feature Module

The first phase focuses on establishing the foundational architecture required for modularization and validating the approach using a critical feature module.

Core Tasks:

  • Set up a build-logic module to centralize dependency management and Gradle configurations using convention plugins.
  • Create core modules:
    • core-network for API handling and Retrofit configuration
    • core-database for Room database and local storage
    • core-di for dependency injection using Dagger
    • core-utils for shared utilities and helper functions
    • core-ui for design system and reusable UI components

Feature Module:

  • Modularize the Auth module:
    • Extract authentication-related code into an independent module
    • Refactor into data, domain, and ui layers using MVVM
    • Introduce Kotlin Coroutines and Flow within the module where applicable
    • Integrate the module back into the main application

Outcome:

  • A stable modular foundation
  • A fully functional, refactored Auth module demonstrating the architecture

Phase 2: Expansion to Core User-Facing Modules

This phase focuses on expanding the modular architecture to additional user-facing features and introducing Jetpack Compose in a controlled manner.

Feature Modules:

  • Modularize:
    • Welcome / Onboarding module
    • Profile / Leaderboard module

Tasks:

  • Extract and refactor each module into independent feature modules
  • Apply MVVM architecture consistently across modules
  • Introduce Jetpack Compose for selected UI screens:
    • Begin with onboarding screens
    • Gradually extend to profile-related UI components
  • Reuse components from core-ui to ensure consistency

Outcome:

  • Multiple modules successfully integrated into the modular architecture
  • Initial Compose-based UI components introduced and working alongside existing XML layouts

Phase 3: Functional Modules and Data Handling Improvements

This phase focuses on modules involving data handling and slightly more complex workflows, along with improvements in asynchronous processing.

Feature Modules:

  • Modularize:
    • Contributions module
    • FilePicker module

Tasks:

  • Refactor modules into data, domain, and ui layers
  • Replace RxJava usage with Kotlin Coroutines and Flow within these modules
  • Improve state handling and lifecycle-aware data flow
  • Ensure proper integration with existing upload workflows

Outcome:

  • Improved data handling using Flow
  • Better state management and reduced complexity in asynchronous operations

Phase 4: Optional Extensions (If Time Permits)

This phase includes additional modules that can be modularized to further extend the architecture.

Modules:

  • Settings
  • Notifications
  • Location
  • Feedback

Tasks:

  • Extract and modularize selected modules
  • Apply consistent architecture patterns
  • Minimal UI changes (no major Compose migration)

Outcome:

  • Extended modular coverage of the application
  • Demonstration of scalability of the architecture

Continuous Tasks Throughout the Project

The following tasks will be performed continuously across all phases:

  • Ensuring backward compatibility and avoiding regressions
  • Testing modules after each integration
  • Fixing bugs and addressing issues such as crashes and ANRs
  • Maintaining clear documentation for each module
  • Regular communication with mentors for feedback and alignment

Timeline

Note : During May 20 - June 3, my university end-semester examinations will take place. While this overlaps slightly with the early coding period, I will remain active in the project and the community. As I am already familiar with the Commons Android App and the contributor workflow, I plan to begin preliminary implementation during the community bonding period while also participating in discussions and reviewing existing pull requests where possible. Although development progress may be slightly slower during examination days, I will continue contributing consistently and will ensure that any limited progress during this period is compensated once the exams conclude.

TimeframeStart DateEnd DateTasks and Subtasks
Community Bonding PeriodMay 1, 2026May 24, 2026Get familiar with mentors and the Wikimedia developer community. Study existing app architecture, identify tightly coupled components, and review modularization patterns. Analyze issues #6691. Finalize module prioritization and architecture design. Set up development environment.
Week 1May 25, 2026May 31, 2026Setup project foundation
SubtaskMay 25, 2026May 27, 2026Create build-logic module and configure centralized dependency management
SubtaskMay 28, 2026May 31, 2026Begin incremental extraction of core modules (starting with utilities and shared components) and progressively expand to networking, database, and DI layers
Week 2June 1, 2026June 7, 2026Continue incremental core architecture setup and stabilization
SubtaskJune 1, 2026June 4, 2026Setup core-di and refactor dependency injection structure
SubtaskJune 5, 2026June 7, 2026Create core-ui module and define base theme/design system
Week 3June 8, 2026June 14, 2026Start Auth module modularization
SubtaskJune 8, 2026June 11, 2026Extract Auth module and restructure into data, domain, ui layers
SubtaskJune 12, 2026June 14, 2026Integrate Auth module with main app and ensure functionality
Week 4June 15, 2026June 21, 2026Refine Auth module
SubtaskJune 15, 2026June 18, 2026Introduce ViewModel-based state handling and clean architecture
SubtaskJune 19, 2026June 21, 2026Introduce Kotlin Coroutines/Flow in Auth module where applicable
Week 5June 22, 2026June 28, 2026Modularize Welcome / Onboarding
SubtaskJune 22, 2026June 25, 2026Extract onboarding module and refactor structure
SubtaskJune 26, 2026June 28, 2026Implement initial Jetpack Compose screens for onboarding
Week 6June 29, 2026July 5, 2026Modularize Profile module
SubtaskJune 29, 2026July 2, 2026Extract Profile module and refactor architecture
SubtaskJuly 3, 2026July 5, 2026Introduce Compose components for selected profile screens
Week 7 (Midterm Milestone)July 6, 2026July 12, 2026Stabilization and midterm evaluation
SubtaskJuly 6, 2026July 9, 2026Test integrated modules (Auth, Welcome, Profile)
SubtaskJuly 10, 2026July 12, 2026Fix bugs, improve integration, and finalize midterm submission
Week 8July 13, 2026July 19, 2026Modularize Contributions module
SubtaskJuly 13, 2026July 16, 2026Extract Contributions module and refactor into clean layers
SubtaskJuly 17, 2026July 19, 2026Improve data flow and state handling
Week 9July 20, 2026July 26, 2026Modularize FilePicker module
SubtaskJuly 20, 2026July 23, 2026Extract FilePicker module and isolate file handling logic
SubtaskJuly 24, 2026July 26, 2026Integrate module with existing upload pipeline
Week 10July 27, 2026August 2, 2026Flow migration and improvements
SubtaskJuly 27, 2026July 30, 2026Replace RxJava with Flow in Contributions/FilePicker modules
SubtaskJuly 31, 2026August 2, 2026Optimize lifecycle-aware data handling
Week 11August 3, 2026August 9, 2026Optional modules + testing
SubtaskAugust 3, 2026August 6, 2026Modularize modules (Settings / Notifications / location / feedback if time permits)
SubtaskAugust 7, 2026August 9, 2026Add unit tests and integration tests
Week 12August 10, 2026August 16, 2026Final integration and project completion
SubtaskAugust 10, 2026August 13, 2026Final bug fixes, performance improvements, and code cleanup
SubtaskAugust 14, 2026August 16, 2026Documentation, developer guidelines, and final report

This timeline is flexible and will be refined in consultation with mentors based on project progress and feedback.

Benefits to the Community

This project will significantly improve the maintainability, scalability, and overall development experience of the Commons Android App by introducing a modular architecture and modern Android development practices.

Currently, the app follows a tightly coupled monolithic structure, making it difficult to implement new features, fix bugs, and onboard new contributors efficiently. Additionally, the use of legacy UI approaches and inconsistent architecture increases development effort and the risk of regressions.

By introducing a structured multi-module architecture along with incremental adoption of Jetpack Compose and Kotlin Flow, this project will enable cleaner code organization, better separation of concerns, and improved development workflows.

Overall, this project will:

  • Improve code maintainability and readability through modularization
  • Reduce coupling between components, enabling safer and faster feature development
  • Simplify onboarding for new contributors with a well-structured codebase
  • Introduce modern UI development practices using Jetpack Compose
  • Improve state management and asynchronous handling using Kotlin Flow
  • Help reduce bugs, crashes, and ANRs through better architecture

The modular structure will also make it easier to introduce future features without impacting unrelated parts of the application.
These improvements will make the Commons Android App easier to maintain and scale in the long term, while also fostering a more contributor-friendly environment within the Wikimedia ecosystem.

About Me

I am Jagadeeshwar Reddy Kota, a second-year undergraduate student pursuing a Bachelor of Technology in Artificial Intelligence and Data Science at Amrita Vishwa Vidyapeetham, Amritapuri. I am an active member of amFOSS and part of the Road to Wiki Cohort 2, where I have been consistently contributing to open-source projects.

I am primarily interested in Android development, web development, and machine learning. I have been working on Android development for over two years and have gained hands-on experience in building applications, debugging real-world issues, and improving user experience. I enjoy working on problems that require both system-level understanding and practical implementation.

I have built several projects across different domains:

Worked on a few more projects across Android, web, and machine learning domains.

My work also extends into reinforcement learning and system design, where I explored trajectory optimization using Proximal Policy Optimization (PPO) for robotic control.

I have actively participated in the open-source and research community, including:

Through my contributions to the Commons Android App, I have developed a strong understanding of the codebase, particularly in areas related to image handling and editing workflows. I enjoy collaborating with the community, reviewing pull requests, and working towards clean and maintainable solutions.

I am motivated by building efficient, real-world systems and continuously improving my technical skills through practical development and open-source contributions.

Availability

Eligible for Google Summer of Code and Outreachy?
I am eligible for Google Summer of Code and am applying only for GSoC.

Do you plan to submit any other proposal apart from this one?
Yes, I have also submitted another proposal (T420138)

Do you have any other plans this summer?
No, I do not have any internships or other commitments during the GSoC period. I will have end-semester examinations from May 20 to June 5; however, I will remain active during this period by participating in discussions, reviewing pull requests, and making incremental progress. After the exams, I will fully dedicate my time to the project. Google Summer of Code is my top priority this summer.

How many hours per week can you dedicate to this project?
I will dedicate a minimum of 42+ hours per week to this project and am willing to invest additional time if required to meet project goals.

Have you been accepted to GSoC before?
No, this is my first time applying for Google Summer of Code.

Previous Contributions

Merged Pull Requests

S.NoPRTitleStatus
01#6479Fix: Explore map crashes when tapped recenter buttonMerged
02#6429Fix: App crashes theme change multi uploadMerged
03#6655Fix: Prevent ActivityLauncher crash by moving registration onCreateMerged
04#6661UninitialisedPropertyAccessException ImageFragment onDestroyMerged
05#6565Fix: Preserve UploadActivity state across screen resizeMerged
06#6642Fix: Incorrect rotation logic and re-edit bugMerged
07#6775Fix: Reset upload state & UI fragments on new external share intentMerged
08#6520Fix: bottom nav visibility media detailsMerged
09#6425Fix: location Permission prompt on Upload via mobile screenMerged
10#6367Fix email verification inputMerged
11#6653Fix: Hide edit image button for unsupported non-JPEG filesMerged
12#6694Fix: Improve UX for Edit image button on the non-JPEG filesMerged
13#6420Fix: Add listener call in ImageAdapter to update UI & uploadMerged
14#6405Make “File Usages” items clickable with correct URLsMerged
15#6637Feat: Link to actual profile when using custom author nameMerged
16#6738Feat: Enhance license selection with Expanding Cards & simplified choicesMerged
17#6578Feature: increase maximum zoom level on upload preview screenMerged
18#6557Enhance custom selector upload limitMerged
19#6417Added wiki prefix to titles in GlobalFileUsageMerged
20#6709Fix: image sorting in custom selector to use historical orderMerged
21#6579Fix: Prevent crash in offline search caused by null map boundariesMerged

Pull Requests Under Review

S.NoPRTitleStatus
01#6532Fix: Prevent crash when pausing/resuming uploads after screen rotationOpen
02#6605Fix: stateless in searchActivity and media detail pager fragment during screen rotationOpen
03#6613Fix: prevent UI settings on logoutOpen
04#6623Add unit tests for findUniqueFileNameOpen
05#6580Feature: Animated multi FAB upload in Pending UploadsOpen
06#6698Enforce upload limit in first step of upload FlowOpen
07#6649Automate issue assignment and implement inactivity managementDraft

Why Me / Motivation

This project strongly aligns with my interest in building scalable and maintainable systems, particularly in the context of Android application architecture and real-world software engineering. The challenge of transforming a monolithic application into a modular, well-structured system while ensuring stability and backward compatibility makes this problem both technically engaging and highly impactful.

My prior contributions to the Commons Android App have given me a strong understanding of the existing codebase, including its architecture, feature flows, and areas where tight coupling and complexity create challenges. Through working on bug fixes, UI improvements, and feature enhancements, I have gained practical insight into issues such as lifecycle handling, state management, and integration between different components. This familiarity allows me to approach modularization with a clear understanding of current limitations and realistic strategies for improvement.

I am comfortable working with Android development using Kotlin and modern development practices. I actively contribute to open source by fixing issues, reviewing pull requests, and collaborating with the community. I place strong emphasis on writing clean, maintainable, and well-structured code, which is especially important for a project focused on architectural improvements.

With my prior experience, familiarity with the Commons Android App, and strong interest in system design and modern Android development, I am confident in my ability to deliver a robust modular architecture that improves maintainability, enhances developer experience, and provides a solid foundation for future growth of the application and I am committed to maintaining high code quality, clear communication, and consistent progress throughout the GSoC period : )

Event Timeline

Thanks @VoidRaven-18 for such a detailed proposal, I hope you're contributions are sorted based on the impact, with the best ones at the top :)

GSoC is a beginner-friendly mentorship program, so we don't expect candidates to just execute tasks without learning and gaining from it. Neel and Sivaraam - please do review the scope of this proposal.

Thanks for the feedback! @RitikaPahwa4444
Yep, i’ll reorganize my contributions to better reflect their impact, with the most significant ones highlighted first annd least ones at the last. Also, I completely agree, my goal through this project is not just to execute the implementation, but to learn from the modularization process, design decisions, and feedback from mentors, while ensuring a a stable and maintainable outcome :)

Looking forward tothe feedback from @Neeldoshii and @Kaartic!

Hi @VoidRaven-18,

Great Proposal,

I’m just curious, please feel free to correct me if I’m mistaken anywhere. I haven’t had much hands-on experience with multi-module setups, so I’d really value your perspective. Since below comments are architectural decisions, they are usually based on factors like maintainability, app size, complexity, and the associated pros and cons. So please take this constructively and feel free to point out any pros or cons. 😅

image.png (2,346×1,730 px, 167 KB)

Here in above how about we have app-module i.e (core)
Core can contain network, db, di, utils

Create core modules:
core-network for API handling and Retrofit configuration
core-database for Room database and local storage
core-di for dependency injection using Dagger
core-utils for shared utilities and helper functions
core-ui for design system and reusable UI components

Can you highlight what all reusable ui componets will go here like buttons, text, edit text, etc and all the feature components will use the components or be dependent on the core ui components.

then we can have a layer that is domain i.e data layer.

Took some suggestion from LLM for domain layer
domain/

├── model/
├── repository/       # interfaces
├──usecase/          # business logic ⭐

And each feature takes from one use case and that acts as a single responsiblity. Not a fan of having multiple use-case for each module I have done that before and felt it very complex for each small changes would love you thoughts here @VoidRaven-18 .

The following feature modules will be prioritized:

Auth Module: Login, signup, and session management.
Welcome Module: Onboarding and initial user flow.
Profile Module: User profile, achievements, and leaderboard.
Contributions Module: User uploads and contribution tracking.
FilePicker Module: Media selection and file handling.

Just want to be sure since the priority one here is breaking the mono into multi module here the main focus will be to just extract the file into seperate module as it is right? Are you planing on migrating Rxjava at this time? I am afraid it might increase complexity while migrating step by step so what's your plan during the extract phase?

I have currently read the proposal currently from architectural POV and it looks good, will check it indepth once again tommorow. Thanks @VoidRaven-18 :-)

Hi @Neeldoshii, Thank you for the feedback, really appreciate you taking the time to go through the proposal and share these thoughts.

Core Modules & UI Components yeah, the idea is to have core modules (network, database, DI, utils, UI) as a shared foundation, while keeping feature modules independent.

for the core-ui, i’m planning a lightweight design system that includes reusable composable components such as:

  • Buttons (Primary, Secondary)
  • Text components with standardized typography
  • Input fields (Compose equivalents of EditText)
  • Common UI elements like loaders, error states, and dialogs

also feature modules would use these components for consistency, while keeping feature-specific UI within their own modules.

Domain Layer & UseCase Granularity I completely understand your concern regarding multiple use-cases becoming complex :)

for tihs my approach here is to:

  • keep use-cases minimal and meaningful
  • group related operations where it makes sense
  • and avoid strictly enforcing one use-case per small action

In the simpler flows, here i'd prefer keeping logic within the ViewModel itself if introducing a use-case doesn’t add much value. So the goal is to keep things pragmatic rather than over-architected.

Just want to be sure since the priority one here is breaking the mono into multi module here the main focus will be to just extract the file into seperate module as it is right? Are you planing on migrating Rxjava at this time? I am afraid it might increase complexity while migrating step by step so what's your plan during the extract phase?

yes, the primary focus initially is safe extraction, notthe heavy refactoring.

plan is:

  1. Extract feature code into modules with minimal changes
  2. Ensure everything works exactly as before
  3. Gradually refactor (MVVM cleanup, Flow, etc.)

i feel that this helps maintain stability while moving towards a cleaner architecture :)

and for the RxJava Migration Strategy I completely agree that migrating RxJava during extraction could increase the complexity

So the plan is:

  • No RxJava changes during the extraction phase
  • Keep the the existing RxJava code as-is initially
  • Migrate to Flow incrementally only after the module is stable

so through this we can ensure we don’t introduce instability while modularizing.

overall the main goal is to first establish the clean modular boundaries, and then improve the architecture step-by-step without breaking existing functionality.

and @Neeldoshii thanks again for raising these points - they were really helpful in refining the approach. Looking forward to your review! and please do correct me if i am wrong anywhere :)

@VoidRaven-18

The following feature modules will be prioritized:

Auth Module: Login, signup, and session management.
Welcome Module: Onboarding and initial user flow.
Profile Module: User profile, achievements, and leaderboard.
Contributions Module: User uploads and contribution tracking.
FilePicker Module: Media selection and file handling.
{F73862357}

Just want to be sure here the FilePicker Module means the custom selector? or which page can you please explain?
As per the diagram and above reference where will the (Nearby, explore & bookmark will be part of the module)?

for the core-ui, i’m planning a lightweight design system that includes reusable composable components such as:
Buttons (Primary, Secondary)
Text components with standardized typography
Input fields (Compose equivalents of EditText)
Common UI elements like loaders, error states, and dialogs

Can you please write this in your proposal?

Domain Layer & UseCase Granularity I completely understand your concern regarding multiple use-cases becoming complex :)
for tihs my approach here is to:

keep use-cases minimal and meaningful
group related operations where it makes sense
and avoid strictly enforcing one use-case per small action
In the simpler flows, here i'd prefer keeping logic within the ViewModel itself if introducing a use-case doesn’t add much value. So the goal is to keep things pragmatic rather than over-architected.

I thing there is confusion here, What I was opposed was for having each feature module to have its own domain layer, what I mean is to have the usecase to be in :core:domain so its useful for all the feature-module and the use case is a single source of truth.

So the plan is:

No RxJava changes during the extraction phase
Keep the the existing RxJava code as-is initially
Migrate to Flow incrementally only after the module is stable

Just want to be sure do you plan on using hilt or exisiting dagger2 once the extract phase is done?

Also when would you be writing the tests and for ui & unit test for the change features after extractions. Also in the flow diagram can you also mention how your test will flow for mocking :core:layer

image.png (652×412 px, 32 KB)

Ref : https://developer.android.com/topic/modularization/patterns

@VoidRaven-18 Can you mention how much hours are you gonna be spent for this proposal?

@Kaartic @RitikaPahwa4444 Can you also review the proposal :-)

Just want to be sure here the FilePicker Module means the custom selector? or which page can you please explain?

Yes , by FilePicker Module, I am referring to the custom selector flow used during the upload.

this includes:

  • Media selection screen (custom selector UI)
  • gallery browsing logic
  • file metadata handling before upload

I will rename this in the proposal to “FilePicker (Custom Selector) Module” for clarity.

As per the diagram and above reference where will the (Nearby, explore & bookmark will be part of the module)?

yep, these were not explicitly mentioned earlier.

My plan is:

  • Explore Module -> includes map-based exploration, nearby places, and media browsing
  • Nearby functionality -> part of Explore (map + location-based discovery)
  • Bookmarks -> can either be:
    • a sub-feature inside Profile, or
    • a separate lightweight module (depending on complexity)

For GSoC scope, I am plannning to prioritize:
Auth -> Welcome -> Profile -> Contributions -> FilePicker
and keep Explore/Nearby as secondary modules, unless advised otherwise. Is this a good idea?

I thing there is confusion here, What I was opposed was for having each feature module to have its own domain layer, what I mean is to have the usecase to be in :core:domain so its useful for all the feature-module and the use case is a single source of truth.

Thank you @Neeldoshii for pointing this out and apologise for the confusion caused here, I understand the concern now.

I agree with your approach:

  • Instead of having a domain layer inside each feature module,
  • we will have a shared core:domain module

Just want to be sure do you plan on using hilt or exisiting dagger2 once the extract phase is done?

To reduce migration risk:

  • rn i plan to continue with existing Dagger2 during the extraction phase
  • Once modules are stable, we can evaluate:
    • gradual migration to Hilt, or
    • continue with Dagger2

Also when would you be writing the tests and for ui & unit test for the change features after extractions

i am planning to introduce the tests after each module is extracted and stabilized, not delayed until the end. WDYT @Neeldoshii?
I will also update the proposal with a simple diagram showing this testing flow.

Can you mention how much hours are you gonna be spent for this proposal?

I will be dedicating 42+ hours per week throughout the GSoC period other than the exam weeks as mentioned in th eproposal, at the exam time the work done will be limited :)

Good proposal @VoidRaven-18

Just wanted to mention a point, the estimation of 2 weeks for the core extraction sounds a bit underestimated given that it would touch all the parts of the repository and not just the parts that we'll be migrating. So, we may need to watch out for that. I think we can take the extraction part by part starting with the stuff like utils, etc. to get an idea on how difficult this would be.

The modules picked sound fine. Just a suggestion that we should focus on getting the core right so that future modularization work can go smoothly rather than needing rework on core. So, better if we handle it well.

About the tests, I wonder if it may be better to try TDD approach rather than adding them post the migration. What do you think @Neeldoshii / @VoidRaven-18 ?

Just wanted to mention a point, the estimation of 2 weeks for the core extraction sounds a bit underestimated given that it would touch all the parts of the repository and not just the parts that we'll be migrating. So, we may need to watch out for that. I think we can take the extraction part by part starting with the stuff like utils, etc. to get an idea on how difficult this would be.

that makes a lot of sense @Kaartic. I agree that estimating 2 weeks for core extraction might be optimistic. I can revise the plan to approach it incrementally, starting with smaller components like utils and shared layers to better understand the complexity before scaling to the rest of the core.Also, I completely agree on getting the core right first, I’ll prioritize stability and clean boundaries there to avoid rework in later phases.

About the tests, I wonder if it may be better to try TDD approach rather than adding them post the migration. What do you think @Neeldoshii / @VoidRaven-18 ?

for the testing, i think TDD approach would be beneficial, especially for core and newly modularized components. I plan to introduce tests alongside extraction/refactoring where feasible, rather than postponing everything to the end.
Thanks again for the suggestions, this really helps refine the approach : )

Hi, thanks for submitting your GSoC 2026 project proposal with Wikimedia!

Please make sure you’ve also submitted your proposal on the official Summer of Code website: https://summerofcode.withgoogle.com. The deadline for both submission and any edits is the same, so ensure everything is finalized before March 31, 18:00 UTC, as changes won’t be possible after that.

We strongly recommend completing any updates at least 30 minutes before the deadline to avoid last-minute glitches or unexpected technical issues.

Wishing you all the best for your application. Hope to see you as part of the program soon! 🚀

Hi, thank you for your submission and the effort you put into your proposal. This year we received over 380 strong applications, and unfortunately we were not able to offer you a slot. This was a very competitive process, and many high quality proposals could not be selected. We truly encourage you to stay engaged and continue contributing to Wikimedia projects. Over the years, many contributors who were not selected for Google Summer of Code have gone on to make impactful contributions and become long term members of the community. Please do not see this as a failure, but as a step forward in your journey. We would love to stay in touch and support your continued involvement.

If you would like guidance on how to contribute to our projects outside GSoC, feel free to reach out to any of the mentors or org admins, they will be happy to help you get started.

You can get started or continue contributing here:

We hope to see your contributions in our community soon.