Emmanuel Bett, engineer
Home

Work

15 systems, from a national platform to a package other people install

Grouped by where they were built rather than by when. 13 of them have a live link or source you can read, because a project nobody can open is a claim rather than evidence. The rest are internal to an employer and are marked as such.

Systems

In role · 2024 to now

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

Products and platforms

Independent

SACCO management platform

A management platform for Kenyan SACCOs, covering the member lifecycle from KYC onboarding through savings, loans and regulatory reporting. The constraint that shapes everything is SASRA: a cooperative holding members' money answers to a regulator, so the reports are not a feature bolted on at the end, they are the reason the data model looks the way it does.

  • Loan lifecycle end to end: appraisal, guarantor management, disbursement, repayment scheduling and arrears tracking
  • Savings engine with automated interest, scheduled deposits and share capital tracking
  • Native M-Pesa integration for deposits, withdrawals and repayments, with STK push and B2C
  • Over thirty financial reports including trial balance, income statement and aging analysis, plus role-based access and audit trails
LaravelVue.jsMySQLRedisDockerKubernetes

Point of sale and operations for Kenyan retail

A till and a back office in one product, built for Kenyan shops. The hard part is not the checkout screen, it is that a sale in Kenya has to satisfy three things at once: the customer paying by whichever method they brought, the stock ledger, and KRA. Getting all three right from a single transaction is the whole design.

  • One checkout screen handling cash, card and M-Pesa STK push
  • eTIMS submission and ETR fiscal receipts, so compliance happens as a side effect of selling rather than as monthly reconciliation
  • Real-time multi-location inventory with barcode and SKU support and low-stock alerts
  • Double-entry ledger auto-posting sales, refunds and supplier bills into P&L and balance sheet
  • Cashier shifts with variance reporting, plus customer purchase history and loyalty
  • Shipped as a progressive web app, so a till installs to whatever device the shop already owns instead of needing a native build per platform
LaravelVue.jsMySQLRedisDockerKubernetesPWA

Performance tuning workshop site

A site for a Nairobi ECU remapping and performance shop specialising in Subaru and Mitsubishi. The audience arrives knowing exactly what they want, so the job was to make the work legible fast: what each stage of tune actually does, and proof it has been done before.

  • Service breakdown across stage 1, 2 and 3 ECU maps, turbo and intake, exhaust and suspension
  • Filterable build gallery by ECU tuning, turbo builds, dyno results and track cars
  • Enquiry form as the single conversion path, since the sale happens in conversation
Next.jsReactTailwindnext/image

Open source

Independent · 2022 to now

Published npm package

A Vue 3 composable and 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
  • Shipped as both a composable and a component, so it drops into an existing input or replaces one
  • Decimal support and integration with Vuetify's validation rules
  • Published and installable: npm i vue-currency-input-formatter
Vue 3TypeScriptVuetifynpm

Kenyan tax tool

Estimates monthly net salary for Kenyan employees, applying the PAYE bands along with NSSF and NHIF deductions. Built because the alternative was a spreadsheet everybody had a slightly wrong copy of.

  • Calculates as you type, no submit step
  • Follows the Kenyan PAYE bracket structure
  • Applies statutory NSSF and NHIF rates
Vue.jsViteJavaScript

Personal finance

Income and expense tracking with running balances, persisted locally so it works with no account and no backend.

  • Live balance, income and expense totals
  • Works fully offline
  • Straightforward transaction entry and removal
Vue.jsJavaScriptLocal storage

Data analysis

Independent · 2022 to 2025

384 days of wearable data, and the mistake I found in my own notebook

381,455 heart rate readings, 283 nights of sleep and 1.85 million steps from a Mi Band 5, analysed and published. The part worth reading is the section where I go back through my own December 2022 notebook and take it apart: the sleep-deficit finding it reported was an artifact of regressing a variable against itself, and no amount of significance was going to save it.

  • Caught a regression-to-the-mean trap in my earlier work: the original model put hours minus hours_prev on one side and hours_prev on the other, so its coefficient of -0.952 at p < 0.001 was forced by the algebra rather than found in the data
  • Proved it with 2,000 seeded permutations. Shuffled nights reproduce the same coefficient, which is what a real effect would not do. Specified properly, last night's sleep explains 0.24% of tonight's
  • Found 381,455 heart rate readings the original notebook never opened, because it read the wrong export file and concluded there was 'not quite a lot of data'
  • Corrected a three hour timezone error by testing which offset places the heart rate trough inside the recorded sleep window, then corroborating it against the independent 03:00 circadian dip
  • Every figure is computed in the browser from the raw export, and the permutation check now runs on every build
PythonPandasD3.jsPermutation testing

Time series forecasting in R

An analysis of a randomly generated M-Pesa transaction set, not real statements of mine: categorising spend, finding the patterns in it, and fitting an ARIMA model to forecast the following weeks with published confidence intervals rather than a single reassuring number. The data is synthetic, so the point of the project is the modelling pipeline rather than the conclusions about the spending.

  • Built on randomly generated transaction data, so the figures are illustrative and the method is the deliverable
  • Weekly spend forecast with confidence intervals shown, not hidden
  • Category-level breakdown of where the money actually goes
  • Interactive published dashboard
RARIMAD3.jsTime series analysis

Exploratory data analysis

Data wrangling and EDA over an HR dataset to identify which factors actually correlate with employees leaving, as opposed to which ones are assumed to.

  • Identification of the factors with real signal
  • Pattern and trend analysis across employee segments
  • Retention recommendations tied to the findings
PythonPandasMatplotlibSeaborn

End-to-end data pipeline

A full pipeline from raw spreadsheet through SQL Server cleaning and transformation to a Power BI dashboard, built to practise the unglamorous middle of analytics work rather than just the chart at the end.

  • Cleaning and transformation done in SQL Server, not in the visualisation layer
  • Interactive Power BI dashboard over the result
  • Documented pipeline from source file to output
ExcelSQLMSSQLPower BI

Tableau visualisation

Twenty-two years of German poultry, pork and beef production charted together, so the substitution between them is visible rather than described.

  • 2000 to 2022 trend analysis
  • Direct comparison across the three categories
Tableau

Geographic analysis

Iceberg sightings across the North Atlantic from 2016 to 2021, mapped geographically and over time to surface the seasonal pattern.

  • Geographic distribution mapping
  • Five-year temporal comparison
Tableau

The interesting part is usually not on the screenshot

If any of these are worth a longer conversation, the decisions behind them are the part I would rather talk about than the feature list.