Things I've built and shipped
Each project starts with a problem I wanted to solve. Here's what I built, why I built it, and what I learned along the way.

FreshTrack
A utility app that helps you keep track of what's in your kitchen, when it expires, and what you should use next. Designed for people who are tired of throwing away food they forgot about.
Why I built this
I kept finding expired items buried in the back of my fridge. The existing apps felt clunky and over-engineered for something that should be simple. I wanted to build something I'd actually use every day.
Challenges
Barcode scanning accuracy was the biggest hurdle. Different products encode data differently, and not every barcode maps to a product database cleanly. I ended up building a hybrid approach that combines barcode lookup with manual entry.
What I learned
Sometimes the best product is the one that does less. Cutting features was harder than adding them, but the app is better for it. I also learned a lot about Android camera APIs and image processing.
- Smart expiry date reminders
- Barcode scanning for instant tracking
- Clean, focused interface
- Fully offline - your data stays on your device

Pamoja
A social fitness accountability app for Android. A small private group sets one shared weekly step target, and everyone's steps count toward it. Step data is read from Google Health Connect, and a leaderboard shows what each member contributed.
Why I built this
Step counters are easy to ignore because nobody notices when you stop. A shared target changes that: your group's number stalls when you sit still. Pamoja ("together" in Swahili) is built around that one idea.
Challenges
Pamoja originally used anonymous accounts, which meant losing your phone lost your groups and your history. Moving to real sign-in with Google, phone, or email meant reworking the data model and rewriting the privacy policy to match. Background sync was the other one: reading steps roughly every half hour through WorkManager without draining the battery or needing a persistent notification.
What I learned
Handling health data changes how you build. Health Connect's Limited Use rules, the Play Data Safety form, and the privacy policy all have to say the same thing, and any drift between them is a real problem rather than a documentation nit. Reading the least data that makes the feature work turned out to be the simplest way to stay consistent.
- One shared weekly step goal per group
- Leaderboard showing each member's contribution
- Daily steps from Google Health Connect, nothing else read
- Private invite-only groups, no public directory
- Background sync that runs without a persistent notification