Emmanuel Bett, engineer

Nairobi, EAT. Open to AI and full stack roles

I build the platforms people use to do their actual jobs, and I keep them running

AI and full stack engineer. I ship internal systems that executives make decisions on, and before that spent four years in Laravel and Vue on platforms where the users are not engineers and the data has consequences, including the national portal the Kenyan government publishes its tenders on.

years shipping production code
4years shipping production code
projects shipped
14projects shipped
npm package published
1npm package published
uptime
99.9%uptime

Nothing here is rounded up. Each figure points at a system that is linked from the work.

The loop I run on a system I have never seen before. It is the same loop whatever the language is, which is the part that carries over when the stack does not match. Read the whole method.

What I am claiming

Three things, and everything else on this site is evidence for one of them

01

I work across the whole request, not one end of it

On BidBuddy the same person designed the Postgres schema, wrote the FastAPI service over it, and built the screen a chief officer approves a bid on. Handing an API over a wall and calling it done is where most of the defects I have had to fix were born.

02

I test the thing, not my belief about the thing

PHPUnit at the unit level, Cypress end to end, and a coverage standard I hold to rather than report on. A green suite is not proof on its own, so the question I ask is whether the test would actually have failed before the fix.

03

I came to engineering through data

Before I wrote services I cleaned datasets, built ARIMA forecasts and shipped Power BI and Tableau dashboards. That is why I reach for a query plan and a measurement before I reach for an opinion about what is slow.

The method

How I work when nobody is checking

Most of what I have built was built in a small team where the review that catches a mistake is not guaranteed to arrive. That constraint shaped every step below. When there may be nobody to catch it, the process has to do the job a second pair of eyes would have done.

  1. 01

    Read the data before the code

  2. 02

    Reproduce it before I touch anything

  3. 03

    Write the failing test first

  4. 04

    Measure before optimising

  5. 05

    Follow the standard, even when mine is nicer

  6. 06

    Leave it explainable

Read the whole method, with a worked example

Selected work

Four that show the range, from a bid pipeline six portals feed into to a package other people install

BidBuddy

2026

Internal bid management platform

An end-to-end platform for running the bid pipeline, from the moment an opportunity appears on a portal to the moment senior management signs off on chasing it. It captures opportunities across six procurement sources: tenders.go.ke, eGP Kenya, KRA, KPLC, KenyaRe and TenderSure, so nobody is refreshing six sites by hand and nobody misses a deadline because they were only watching five.

  • Aggregates six procurement portals into one pipeline with a single view of what is open and what is closing
  • Weighted qualification scorecard, so bid or no-bid is argued from consistent criteria rather than from whoever is loudest in the room
  • Sequential CRO to CGO approval chain feeding senior management decisions, with each stage recorded so an approved bid carries the reasoning that got it there
  • Microsoft Entra ID single sign-on, because an internal tool nobody has a separate password for is an internal tool people actually use
Next.js 16FastAPIPostgreSQLSupabaseMicrosoft Entra IDDocker

Internal system, no public link.

Leave Management System

2026

Multi-country HRMS, built on Horilla

A leave management system built on the Horilla open source HRMS, serving employees across five countries from one deployment. The interesting problem is not the request form, it is that five countries means five sets of statutory entitlements, five public holiday calendars and five ideas of who signs off on what, none of which can be hardcoded if the sixth country is ever going to be cheap to add.

  • Country-specific leave policies: statutory entitlements, accrual schedules, carry-forward and expiry rules, and separate public holiday calendars per jurisdiction
  • Configurable approval hierarchies, so each country routes requests through the chain it actually uses rather than a shared approximation of one
  • Employee self-service for balances, requests and history, with manager and HR dashboards for approvals, team coverage and reporting
  • Full audit trail behind every state change, because leave records are the kind that get disputed months after the fact
HorillaDjangoPythonPostgreSQLDocker

Internal system, no public link.

National government tender platform

The platform Kenyan government tenders are published and managed through, serving suppliers and procurement officers across the country. Search, filtering and reporting over procurement data that has to be correct and available when a tender deadline lands.

  • REST API architecture over procurement data, built for read-heavy access under deadline-driven traffic spikes
  • 99.9% uptime on operations that cannot be paused for a deploy
  • Horizontal pod autoscaling on Kubernetes to absorb bursts rather than provision for the peak permanently
LaravelVue.jsMySQLRedisKubernetesCypress

Published npm package

A Vue 3 component that formats numbers with thousands separators as the user types. The hard part is not the formatting, it is holding the cursor in the right place after the string under it has changed length, which is why most implementations of this feel broken.

  • Maintains cursor position correctly while the formatted value grows and shrinks
  • Decimal support and integration with Vuetify's validation rules
  • Published and installable: @emmanuelbett/vue-number-input
Vue 3TypeScriptVuetifynpm
All work

If your stack is one I have not used, the method is the part you are actually hiring

Open to AI and full stack roles, based in Nairobi, Kenya. The fastest way to get a sense of how I think is the method page; the fastest way to reach me is email.