01
Project name
Pebla
The AI Splitwise for Africa
One-line description
A mobile money super-app for Africa that lets people pay, split bills, track spending, and earn rewards, without replacing the wallet they already use.
My role
Timeline
Category
Platforms
Tech stack
02
Mobile money is how millions of people in Africa pay every day, but the experience around it is fragmented. People routinely split restaurant bills, rent, and group gifts by hand; dial long USSD codes for simple transfers; lose receipts buried in SMS threads; chase friends for weeks after fronting a shared cost; and switch between apps for airtime, electricity, and peer-to-peer payments. Pebla’s challenge was not to replace mobile money wallets, but to sit on top of them: unify pay, split, history, utilities, referrals, and loyalty into one clear consumer experience, while staying honest about what is real data vs. demo, and staying compatible with a production backend already serving live users.
03
I helped build Pebla 3.0, a consumer-focused redesign of the Pebla mobile app on a dedicated product branch (pebla-active) within the production codebase. The app guides users through familiar mobile money flows (USSD-based payments) while adding a modern UI layer for contacts, splits, transaction history, bill payments, referrals, and a loyalty wallet. SMS confirmation messages are parsed and enriched locally so history stays accurate even when the carrier is the source of truth. Production-critical capabilities from the main app, eKash saved numbers, preferred SIM selection, scan-to-pay OCR, payment location capture, and push-driven utility flows, were ported and reconciled with the new consumer shell so the redesign did not regress live behavior.
04
Pay anyone, fast
Send money via contacts, saved favourites, typed numbers, or merchant codes, with duplicate-payment detection and category tagging.
Split bills
Equal or custom splits, shareable split links, and QR-based in-person settlement.
Everyday utilities
Airtime, data, electricity, and water top-ups integrated into the same payment flow.
Transaction history & insights
Local SQLite persistence, SMS enrichment, category defaults, and optional map-based location on payments.
eKash
Save, edit, and pay bank/mobile-money hybrid numbers with channel-aware history and masking.
Scan-to-pay
Camera and gallery OCR to extract MoMo numbers and USSD codes from receipts and screens.
Referrals & loyalty
Refer-a-friend flows, deep-link referral capture (clipboard + install referrer), loyalty wallet with QR earn/redeem, and home-screen widgets.
Cinematic onboarding & Pebla 3.0 design system
Liquid-glass navigation, Inter typography, Lottie onboarding, and platform-adaptive UI (Cupertino / Material).
05
Clean Architecture with Domain-Driven Design, split into three layers: Domain (entities, repository interfaces, use cases, business services), Data (SQLite schemas, API repositories, SMS/USSD adapters), and Presentation (GetX controllers, pages, reusable widgets). Dependency injection via GetIt; navigation via go_router; cross-feature communication via an EventBus (payments, FCM, history refresh).
REST API integration for auth (OTP via Pindo), user profiles, referrals, loyalty cards, and utility transactions. Aligned the client with the real backend contract, e.g. scoped referral listing (GET /referrals/user/:id) and invite delivery via POST /referrals/share-requests, and documented gaps in an internal API requirements spec for the backend team.
Flutter app with a feature-based folder structure. State lives in GetX controllers; UI follows a Pebla 3.0 token system (colors, spacing, typography, glass materials). Platform channels handle USSD dialing, SIM slot persistence, SMS reading, home widgets, and Live Activities on iOS.
SQLite with modular table schemas (payments, pending tags for SMS matching, eKash saved numbers, utility history, contact category defaults). An enrichment pipeline matches incoming MoMo SMS to pending payments using fingerprinting.
Mobile money via USSD (native plugin); SMS parsing and transaction enrichment; Firebase Cloud Messaging for electricity token delivery and referral refresh signals; Google ML Kit text recognition for scan-to-pay; Geolocator for optional payment location capture; deep links (app_links, install referrer, iOS clipboard referral recovery); Contacts integration for pay and split flows.
Android and iOS product flavors (production / dev) with separate bundle IDs. Native home screen widgets (Android App Widget + iOS WidgetKit / Live Activity). Demo/stub data quarantined behind dev flags, never served as production history in release builds.
06
Multi-branch production parity
The production repo had active work spread across dev, eb/dev, and experimental branches (scan-to-pay, flavors, location). Audited each branch against pebla-active, ported missing logic into the consumer tree, and verified with flutter analyze and 211 unit/integration tests.
Referral API mismatch
The client assumed endpoints that staging did not expose (global referral list, bulk invite POST). Switched to the scoped user endpoint and the share-requests invite contract, updated documentation, and removed dead request models.
SMS as source of truth
MoMo confirmations arrive seconds after USSD execution. Immediate history refresh caused empty or stale rows. Aligned with production: schedule refresh after 10 seconds so the SMS enricher can match pending category tags.
Android dual-SIM reliability
Subscription IDs change when SIMs are swapped. Implemented slot-index persistence with MCC/MNC fingerprints (SimUtils) so auto-message and USSD always target the user’s preferred SIM.
Data integrity in a redesign
Early UI scaffolding used stub repositories that could look like real data. Quarantined stubs, gated demo history behind debug flags, and removed out-of-scope features (Groups, Offers) from the consumer track.
eKash controller lifecycle
Bottom sheets created GetX controllers that outlived their UI. Fixed DI registration, passed controllers explicitly into sheets, and updated test mocks so eKash did not break the payment test suite.
07
Shipped the pebla-active consumer branch with 255 files of redesign + production parity work pushed to the production repository. Zero analyzer issues; 211/211 tests passing after parity and mock fixes. Unified pay, split, utilities, referrals, loyalty, eKash, and scan-to-pay under one consumer shell. Backend API requirements documented for remaining server-side gaps (FCM referral push, loyalty empty states). Android/iOS flavor setup and home widgets ready for staged rollout. Store metrics and user growth figures to be added post-launch.
08
09
I design and ship production-ready systems at the intersection of cloud infrastructure, full-stack engineering, and human-centred product thinking.
Send email · kuzagbechristopher@gmail.com