Senior Android Developer (Full-Time Contractor)
Elektra USA
Jul 2024 – Jan 2026
Remote (US client)
- Contract
- Remote
- Fintech
- Remittances
- Cross-border payments
1–1.5s faster
App load time
Dependency cleanup, workload separation, restructured Hilt graph
70%
Legacy UI migrated to Compose
2 per month
Release cadence
Two-week sprints, one release roughly every sprint and a half
Agency → direct contract
Engagement
Moved from staffing agency placement to the client's internal contracting entity
- Modernized a cross-border remittance app by migrating legacy UI flows to Jetpack Compose and Navigation Compose.
- Cut app load time by 1–1.5 seconds through dependency cleanup and restructured dependency injection.
- Rebuilt the transaction core — the flow the product depends on — with proper architecture and no documentation to start from.
- Architected new features with Clean Architecture and MVVM in a 40+ person distributed product organization.
- Diagnosed and resolved a production signing-hash regression that broke Google service integrations.
Stack
- Kotlin
- Jetpack Compose
- Navigation Compose
- Hilt
- MVVM
- Clean Architecture
- Coroutines
- Flow
- Android Studio Gemini
Read the full story
Context
Elektra Go is a fintech app for cross-border remittances: sending money from the US to Mexico, plus buying airtime, paying services, applying for a card, moving funds over ACH, and topping up the balance from stores in the US. The product is built for Mexican users living and working in the United States, which means every flow has to be simple enough to use after a long shift and trustworthy enough to move someone’s paycheck.
The codebase was the real constraint. It had passed through several external consultancies, it was in-house development with no documentation, and it carried years of dead code, duplicated logic, and dependencies nobody could justify anymore. Shared flows ran across the entire app, so almost nothing was truly isolated — change one thing and you could break a payment path you had never opened.
The team was large and distributed: 8 Android engineers (4 senior, 4 mid-level), 8 on iOS, around 8 on backend, about 5 in QA, plus tech leads and several product owners. I joined as an independent contractor through a US staffing agency, and later moved to a direct contract with the client’s internal contracting entity — retained on delivery quality rather than on the agency relationship.
What I did
As one of four senior Android engineers, I did code reviews, made architecture decisions, and mentored the mid-level engineers through pairing sessions.
Stabilize before migrating. The first phase was subtraction: cleaning up dependencies, deleting code that was no longer used, and starting to centralize logic that had been copy-pasted across dozens of screens. Migrating a feature on top of a codebase you do not understand just moves the mess to a new syntax.
Migrate the UI. Once the ground was stable, we moved screens to Jetpack Compose. We started with classic Navigation and eventually migrated to Navigation Compose. For the Compose work itself I used AI-assisted tooling to accelerate UI prototyping and cut boilerplate.
Rebuild the core. The remittance and transaction flow was officially untouchable — it was the product. Eventually it had to be rebuilt anyway, with proper architecture and practices. Getting there took sustained pressure from the senior engineers, because the honest cost was the time required to understand the basecode before touching it. Without documentation, and with shared flows crossing the whole app, reading and tracing dependencies was the work.
Fix production. Details in the section below — the app lost access to some Google services after a signing hash changed.
Architecture and decisions
Hilt over Koin. We chose Hilt because it is the Android standard and the team already knew it. Koin was technically viable and would have been faster to adopt in places, but adding a third-party dependency meant going through approval with the product owners. The standard option was the one we could justify without a fight, and consistency across 8 Android engineers mattered more than a small ergonomic win.
Order of migration by risk, not by visibility. The first screens to move to Compose were the low-impact “side features” — the ones with the fewest dependencies on the rest of the app. That gave us real migration experience on code that could not take down a payment, and it built the pattern before we applied it to anything critical.
Everything is a shared flow until proven otherwise. The founding assumption became: this flow is referenced somewhere you have not looked. It changed how we planned every refactor and why dependency cleanup had to come before feature migration.
The signing hash incident
A change in how CI/CD generated the build changed the hash the app was signed with. The app kept working for most users, but integrations with some Google services broke because the registered certificate hash no longer matched.
Diagnosing it meant working backwards from the symptom: the build was green, the APK installed, but the service handshake failed. I traced it to the signing configuration change, then had to recover the correct hash — which no longer matched anything we had on file.
The fix required generating a temporary production build purely to extract the new hash from it, updating the value in the Google developer console, and verifying the affected integrations. The lesson was that signing identity is production configuration, not build detail, and it deserves the same change control as a database migration.
Impact
- App load time reduced by 1–1.5 seconds.
- 70% of the legacy UI running on Jetpack Compose.
- Transaction core rebuilt on a maintainable architecture, with the senior team aligned on why it was worth the cost.
- Release cadence of 2 per month held while the migration was in flight.
- A production incident resolved without a user-facing outage.
What I would do differently
I would use AI to map the basecode from day one. Understanding an undocumented codebase is exactly the kind of reading-heavy, high-volume work that agents are good at, and it is the best use of AI I have found when starting on an existing project: feed it the unfamiliar modules, ask it to trace shared flows and dependencies, and get a map in hours instead of days. We lost real time doing that manually, and it would have shortened the path to the core rebuild.