Case Studies
What each problem was, what Sachintha Gunaratne decided, and how it turned out.

MCQ Karamu
MCQ practice app on Google Play for Sri Lankan students sitting A/L and O/L exams. Built with Akila Kavinda.
Objective
Past paper practice here is a stack of PDFs, and students sit the exam in Sinhala, Tamil, or English depending on where they went to school. Language is the first thing an exam app drops, and most of these students have no card to pay with.
Key Decisions
Made the question model trilingual in the first version instead of shipping English and translating later.
Three variants of every question to author, in exchange for Sinhala and Tamil students getting the same app rather than a worse one.
Billed subscriptions to Dialog and Mobitel phone accounts rather than to cards.
A revenue share and two telco integrations, in exchange for students without a bank card being able to subscribe at all.
React Native on Firebase, with no server of our own to run.
Less control over the data layer, in exchange for two people shipping and maintaining the whole product.
Impact
- Live on Google Play with subject-wise past papers, timed exams, instant results, and progress tracking.
- Every question bank in Sinhala, Tamil, and English, so a student practises in the language they will sit the paper in.
- Students subscribe from a prepaid phone balance, on Android 7 and up.

Ideamart & MSpace Subscription Service
Open source Express service that puts Dialog Ideamart and Mobitel MSpace subscription billing behind one API. Pulled out of MCQ Karamu and released on its own.
Objective
Carrier billing is the only realistic way to charge a Sri Lankan student with no bank card, and each telco has its own OTP flow and documentation that is hard to follow. I wanted one set of endpoints the app could call without knowing the network, and a way to stop one subscription being passed around a class.
Key Decisions
One interface over both providers, with the differences absorbed in a mapping layer.
A layer to maintain as either platform changes, in exchange for an app that never branches on carrier.
Read subscription status from the carrier on request instead of mirroring it locally.
Entitlement checks need a live call to the telco, in exchange for access that matches what the carrier actually charged.
Bound each account to one active device, so registering a new phone displaces the old one.
A student changing phones has to re-register, in exchange for one paid subscription not covering an entire class.
Impact
- OTP, unsubscribe, status, and charging info for both carriers behind one set of endpoints.
- Runs the billing behind MCQ Karamu.
- Open source, as a working reference for an integration the official docs cover poorly.