Technical challenges
Two areas stood out. First, CIPPO's dependency injection is hand-rolled (no Hilt/Dagger/Koin) — a single factory class wires up 196 ViewModels, and extending it safely as new features were added meant understanding and preserving that pattern rather than working around it. Second, the app combines a REST API (Retrofit) with several Firebase services (Realtime Database, Firestore, Auth, Storage, Messaging) across a large, actively-evolving feature set, and keeping data consistent across that hybrid backend while building new features was a recurring concern.
How I approached it
For dependency injection, new features were wired into the existing manual factory pattern consistently, rather than introducing a second, incompatible DI approach into an already-large app. For the hybrid backend, features were built to go through the app's existing data-source abstractions (REST vs. Firebase per feature) so the rest of the app didn't need to know which backend a given feature used underneath.


