You are here: Home . Portfolio


Some of the work I've done so far. It is by far not everything ( for example, professional arm-wrestling, sky-diving and thumb-wrestling aren't included ).

MTN Zukuka


Channel: USSD

Status: Closed, Feb ’15

The product, open to 10-million subscribers awarded 3 minutes to any MTN number between 5:00AM and 8:00AM on weekdays.

Challenge: Scale. The product had over 6 million users and since its main window of use was 3 hours ( 5 to 8 AM), the number of requests to the system during that time went through the roof. Sidney, Alex & I came up with two main ways to handle the traffic bursts – asynchronous processing & serving some requests on another system.

MTN 1-4-1


Channel(s): USSD and SMS

Status: Migrated, March ’13

MTN 1-4-1 is a loyalty programme. It awards subscribers points for using the telecommunication network; the subscribers can then use those points to purchase voice or SMS. The product’s special to me because it’s in building and supporting it that I first learned about profiling code, database design & system administration. Scale challenges. A history of working with frameworks & CMSs had kept a lot of this good stuff away from me.

Challenges: Scale. At migrating it to another system (the migration had nothing to do with product performance), it supported over 4 million subscribers. I was a one-man team at the time. I did caching, code profiling, re-designed the Db (partitioned, better index usage, etc), optimized the server ( changed ulimits, etc) and spent a number of nights awake. All done, it worked beautifully. And I slept more.

SMS Broadcasts


Channel: SMS

Status: Active

Nothing fancy here; the application receives a message and broadcasts it to a list of users. The interesting part is…

Challenge: Using Kannel to send long messages ( text messages that contain more than 160 characters). The messages needed to appear on the receiver’s handset as one message. Fixing this required a much deeper dive into the SMPP protocol (the language SMS servers generally speak to each other with) to eventually get it to work correctly; at the time, Kannel documentation everywhere on this particular issue was sparse.

MTN Selfcare


Channel: Android

The Android app allowed MTN subscribers to perform a number of functions – check balances, activate services, get information about services, contact customer care, etc. This was a particularly interesting beast to work on since it needed to interface with a myriad of services from different vendors(the companies that sell software & hardware to telecom companies). I was building it as a hobby project so that too presented a few access problems since  vendors, naturally, required approval from up on high to grant me access. On the technical front, it didn’t help matters that Android Fragments were still quite new and I chose to work with them; the learning experience wasn’t the most fun process.

Mobile Voting


Channel: USSD

Status: Closed, Dec ’12

The app allowed MTN staff, during the 2012 staff party, to vote for their favorite performances. The results were displayed, in real-time, on a screen on the main stage. I’ve added this not because it presented any challenges in development; the fun part was…

Challenge: For some interesting reason, the results on the screen on stage stopped updating. Just like that. Software sure knows how to pick moments to throw a fit. I died a few times as I negotiated with the code to play nice. Everyone in the hall (over 700 people) stared expectantly at the screen…and waited…and sipped their drinks…and waited. (insert happy ending)  #GoodTimes

MTN Asante Sana


Channel: USSD

Status: Closed

As MTN turned 15, the app aimed to give away about $4 million dollars to the network’s subscribers over a period of 90 days. Another good way to give this money out would have been for the CEO to skydive over each district, pull it out of his pockets and make it rain. This idea wasn’t welcomed; my guess is the CEO didn’t feel physically fit enough for the challenge. Either that or he foresaw that while still in the air, new districts would be formed and he’d have to do it all over again. You do agree though that it was a better idea than building this app don’t you?

ULK Facebook Loyalty Programme

Urban Legend Kampala_Logo_1

Channel: Web

Status: Closed, Sept ’12

The product allowed to track and reward certain behaviour on the site. This served two main purposes; Get an idea of who the most loyal (and engaged) readers were (and reward them) and also, encourage certain behaviour on the site (sharing, commenting, etc).

Challenges: At the time of development, the Facebook PHP API had quite a number of bugs. After quite a few battles, switched to the JS API and that worked well. The app involved some custom actions ( like in addition to ‘liking’ an article, you could say ‘hug’ the author ), all using the Facebook API. Getting those custom actions approved at that time involved a bit of back and forth with Facebook (and considerable waiting).

ULK Chrome extension


Status: Active

The Chrome extension showed a desktop notification whenever a new post was published on It was interesting building it

ULK Android app


Status: Active

The app displays articles from the website. It basically processes the feed and stores the articles for offline access. When it was published in the app store, it was the first custom company app from Uganda and generally among the only apps from Uganda. That’s such a long time ago, action bars had only just been added to Android and the Android compat library didn’t even have them yet (actionbbarsherlock ruled!). The majority of devices in our market at the time didn’t support the action bar.

Challenges: Documentation was quite sparse; I filled several gaps by trial and error. Also, I didn’t want thumbnails ( or any image re-sizing ) to be done on the handset so I made changes to the site (and its feed) to have that done server-side. Creating thumbnails from images not hosted on your site (the majority of the site’s images) was a challenge, especially since this was in the wake of timthumb security breaches.

I’ve never updated the app since *hangs head in shame* I want to re-write a lot of it but I don’t think I’ll ever get that time. Totally open to new hands on deck.

Jaguza WordPress theme


Status: Active

Jaguza was the second premium WordPress theme I built. I chose to give this out free in the WordPress repository; I wanted to be better acquainted with the approval process and know for sure what flies and what doesn’t. The theme’s been active in the repository since


It really is a great theme for your WordPress blog. Check it out. it’s free. I plan to overhaul the admin side of the theme to simplify it further.

Kanzu Support Desk


Status: Active

Under Kanzu Code, built a WordPress plugin for customer care. It is a simple, personal and powerful help desk solution that takes your customer support to the next level by allowing you to manage your customer conversations from various channels (Twitter, Facebook, Email, Web support Form) in a single place. The core plugin’s freely available in the WordPress Plugin Repository