Work

Things I have built, with their actual status.

Each project carries its real status — what is deployed, what is in development, and what was built for a course.

Project 01

Mboa Health

A health application for Cameroon, built for the phones and networks people actually have.

In development · not deployed

FlutterDartProvidergo_routerPHPRESTJWTMaterial 3GitHub Actions

Problem

Getting to a clinic often means not knowing which one is open, how far it is, or what to do first. Paper records go missing between visits, so each consultation starts from nothing. In an emergency there is no fast path to the right contact.

Context

A mobile health application for Cameroon. The audience is general public rather than clinicians, which sets the bar for how much the app is allowed to assert about someone's health.

Constraints

  • Lower-end Android devices, so the minimum supported API level is 21 and payload weight is a real budget rather than a nice-to-have.
  • Intermittent connectivity, so anything that assumes a live request will fail in the field.
  • Health data, which changes what is acceptable to log, cache and retain.
  • A single engineer, so anything clever has to be maintainable by one person months later.

My role

Technical build across the Flutter client and the PHP API — architecture, implementation, the design system, the test suite, and the CI setup.

Architecture

Feature-first module layout rather than layer-first. Auth, profile, health records, reminders, notifications, clinic locator and emergency each own their own state through Provider, with go_router handling navigation between them.

Behind that, three domains — auth, profile and health records — sit behind a repository abstraction with typed API models, so the call sites do not know or care whether data came from the network or a local store.

Key decisions

  • Rule-based triage, not a model. A decision tree over documented symptom paths. Every branch is reviewable by someone who is not an engineer, and the app can explain exactly why it said what it said. A classifier would have been easier to build and impossible to defend.
  • Repository abstraction before the offline work. Introduced while the app was still online-only, specifically so the offline layer can slot in underneath without rewriting the feature modules.
  • Tonal elevation instead of drop shadows. The design system uses surface tone to express depth because soft shadows band badly on low-cost LCD panels.
  • Build-time API base URL. Environments are a build flag, not a runtime toggle, so a debug endpoint cannot ship in a release build.

Implementation

Flutter and Dart on the client, PHP on the server, REST between them with JWT for session handling. A custom design system — Clinical Sanctuary — fixes the palette, an 8pt spacing grid, and the type scale, so screens stay consistent without a component library.

Built and working in the codebase: authentication, profile management, health records, reminders, notifications, clinic locator, emergency contacts, the emergency portal, and the rule-based symptom checker.

Testing

88 automated tests — 72 in Flutter, 16 on the PHP API. CI runs lint and the full suite and blocks a merge if either fails, so the gate is enforced rather than aspirational.

The repository also carries an architecture document, a deployment runbook and a risk register, which matters more than it sounds: the runbook is what makes the deployment reproducible by someone who is not me.

Security

  • Server-side login rate limiting, so throttling cannot be bypassed by talking to the API directly.
  • JWT revocation, so a compromised session can be ended server-side rather than waiting for expiry.
  • Password reset backed by a proper token table.
  • Secrets moved out of source and into build configuration.
  • Bounded queries — health records and reminders are capped rather than unbounded — so a large account cannot degrade the API for everyone else.

Trade-offs

  • Rule-based triage is narrower than a model and has to be extended by hand. That is the cost of being able to explain it.
  • A hand-rolled design system means no ecosystem of ready components, in exchange for control over rendering on cheap panels.
  • PHP was the pragmatic server choice for the environment rather than the interesting one; the repository abstraction is partly insurance against that decision.

Status

In development. The feature set above is implemented in the codebase, but the application has not been deployed and is not in front of patients. A migration-readiness review for moving the backend to Laravel returned not yet, with three gates still outstanding.

Not built

Scoped but deliberately not implemented: a QR emergency health passport, AI health companion mapping, and a further privacy and security pass. None of these exist yet, and the app does not behave as though they do.

Next

Clear the three migration gates, add crash reporting and structured logging, then move to a real HTTPS deployment with scheduled database backups — in that order, because there is no point collecting crash data from an environment that is not yet reproducible.

Lessons

The abstraction I am most glad about is the one I added before I needed it. The one I underestimated is documentation: the runbook and risk register took an afternoon each and are the only reason the deployment path is legible now.

The harder lesson was scope. Health software makes it very easy to promise interpretation, and most of the engineering discipline here went into deciding what the app is not allowed to claim.

Project 02

Rise for Impact

Founder and Team Lead of a youth initiative — and the person who builds its software.

Dual role

I founded Rise for Impact in April 2025 and lead the team. I am also the only engineer on it, which means the roadmap and the implementation are decided by the same person — useful for speed, and something I have had to actively guard against when the convenient technical answer is not the right programme answer.

Operations

Programmes run in Cameroon, Ghana, Nigeria and Rwanda. The organisation publishes 500+ young people engaged across those programmes — programme reach, not platform accounts.

The people running it day to day are volunteers, not operators. That single fact drove most of the build: anything that required a developer to change was treated as a design failure.

Built

  • The public site and the application behind it, from schema through API to interface.
  • A content area programme staff publish through directly, without a deploy.
  • Fellowship application handling, from submission through review.
  • Admin tooling for tracking programmes across the four countries.
  • The deployment pipeline — GitHub to Vercel, with a preview build per branch so changes are reviewable before they are live.

Constraints

Most people arrive on mid-range Android devices over mobile data. Page weight and round trips mattered more than framework choice, and the content model was kept flat specifically to avoid the request waterfalls a nested one would have created.

Live

TypeScriptReactVercelCI/CD
The Rise for Impact platform home page

Project 04

Machine learning

Three projects from a two-month AI & Machine Learning internship at Future Interns, June to July 2025. Each one shipped with an interface, because a model nobody can use is a notebook.

Churn prediction

An XGBoost classifier over listening behaviour, wrapped in a Streamlit app with feature-importance output so the result is something a person can act on.

Internship project · 2025

PythonXGBoostscikit-learnStreamlitPandas
The churn prediction dashboard

Conversational support agent

Dialogflow handles intent classification and entity extraction; the OpenAI API generates the response. Multi-turn context is carried across the conversation, with a confidence threshold that falls back to a clarifying question rather than guessing.

Internship project · 2025

PythonDialogflowOpenAI APIStreamlit
The conversational support agent interface

Sales forecasting

Time-series forecasting with Prophet, surfaced through Power BI dashboards so the output lands where the decisions are actually made.

Internship project · 2025

PythonProphetPower BIJupyter

Have something worth building?