All projects
pebla-cover

Pebla

The AI Splitwise for Africa

01

Overview

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

Mobile Engineer (Flutter), consumer redesign, production parity, API integration, and platform-native features

Timeline

2025 to August 2026

Category

Consumer App · Fintech

Platforms

iOS & Android (pebla-active)

Tech stack

FlutterDartGetXgo_routerKotlinSwiftSQLiteREST APIs (Dio)Firebase Cloud MessagingUSSDML Kit OCRDeep links

02

The Problem

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

The Solution

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

Key Features

  • 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

Technical Implementation

Architecture

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).

Backend

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.

Frontend

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.

Database

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.

APIs / Integrations

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.

Infrastructure

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

Challenges & Solutions

  • 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

Results

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

What I Learned

  1. 1.Parity audits beat blind merges. When a redesign lives beside production in the same repo, a feature checklist per branch (dev, experimental, main) prevents silent regressions better than merging and hoping.
  2. 2.The wallet is not yours to replace. Designing around USSD and SMS, instead of fighting them, made the product credible for African mobile money users and simplified the architecture.
  3. 3.Backend contracts must be verified, not assumed. Staging behavior differed from docs; aligning the client to real endpoints early saved weeks of invite and loyalty bugs.
  4. 4.Honest data boundaries build trust. Quarantining demo stubs and gating sample history is cheap technically but critical for a financial app’s credibility during a UI overhaul.

09

Links

LET'S WORKTOGETHER

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