Work

Some problems I have spent time on, and why they kept me. Most start the same way, noisy data, infrastructure that will not stay up, research that is hard to move, or people who need a better tool.

Sometimes the answer became a production system, sometimes a library, sometimes research, and sometimes the useful thing was helping someone else learn to solve it. These are some of those.

Ubunye Engine: portable Spark pipelines for data and ML: The pipeline should outlive the platform it runs on
Open Source · Ubunye Engine

The pipeline should outlive the platform it runs on

Data and ML teams rebuild the same infrastructure plumbing every time work moves between a laptop, a shared cluster and production. Ubunye Engine separates what a pipeline does from where it runs, so the logic stays still while the infrastructure underneath it is replaced.

Why it mattered

The tools are not the problem. The same read, transform and write scaffolding gets rewritten per team and per platform, and a pipeline written for one environment quietly hardcodes it. The cost is duplicated engineering, results that are hard to reproduce anywhere else, and capability that belongs to whichever platform it was built on.

What changed

A pipeline is one YAML file and a Python transform. Connectors, model registries, lineage stores and artifact storage are all plugins registered from outside the engine, so a new source or a new storage backend needs no engine edit. The same task folder runs on local Spark, Docker, Kubernetes, S3-compatible storage and spark-submit, and a build job fails unless all five produce byte-identical output.

AI EngineeringMLOpsData PipelinesReproducible ResearchOpen Source
Explore the work
TFiltersPy: Kalman and particle filters for Python: You should not have to become a specialist to get a clean signal
Open Source · TFiltersPy

You should not have to become a specialist to get a clean signal

Real sensors lie, and the mathematics that corrects them is well established but different for every method. TFiltersPy puts five Bayesian filters behind one familiar fit, predict and score interface, so choosing a method becomes a decision about the problem rather than a rewrite of everything around it.

Why it mattered

Each filter has its own mathematics and its own implementation shape, so moving from a Kalman filter to a particle filter usually means rebuilding the surrounding code as well. That cost is why teams tend to stay with the first method they tried, or wait for the one person who can derive the right one.

What changed

Kalman, Extended, Unscented, Ensemble and Particle filters share one estimator interface, with online updates on all five, RTS smoothing on the linear and extended filters, and forecasting on the linear one. A worked radar example compares EKF against UKF on the same data, and a decision guide says which filter suits which problem. Published on PyPI, tested on Python 3.9 through 3.12.

Sensor DataState EstimationKalman FilteringTime SeriesOpen Source
Explore the work
Agent Roadmap Kit: learn AI agents by building one, free: Understand agents by building one, for free
Open Source · Agent Roadmap Kit

Understand agents by building one, for free

A reader of the agents series asked where they could try it themselves. The kit is the answer: six stops, each adding one working piece, that end in an assistant answering questions from your own notes, with tools, search by meaning, safety controls, tests and CI.

Why it mattered

Most material about agents is either a demo that hides the hard parts or a framework that hides everything. Readers could follow the argument of the series but had nowhere to see a planted instruction fool a model, a retrieval index return nothing, or a green build pass while the answer was wrong.

What changed

Six stops, sixty seven tests and a CI workflow that runs them on every push, all on free options: the free Gemini tier from Google, a small local model through Ollama, or a built in mock that needs no key and no internet.

AI AgentsRetrievalAI SafetyTesting and CIOpen Source
Explore the work
Data science platform at a bank: telematics and MLOps: Building the platform data science runs on at a bank
banking

Building the platform data science runs on at a bank

Good models are only one part of a working data-science function. The data, engineering, governance, tooling and team around them decide whether anything survives in production.

Why it mattered

Moving analytics from infrastructure not built for big data toward a cloud first, engineering oriented capability is what lets analytical products be built, deployed, governed and improved repeatedly rather than once.

What changed

Telematics processing cut from months to under a day, and a data engineering capability, running on Ubunye Engine, that 10+ products now sit on.

Production MLMLOpsTechnical LeadershipAI GovernanceGeospatial AITelematics
Explore the work
Generator optimisation and streaming at Vodacom: Deciding where a national network needs attention first
Telecoms · Network intelligence and optimisation

Deciding where a national network needs attention first

Enormous volumes of imperfect operational data had to become decisions about where resources, infrastructure and intervention were needed most across a national telecommunications network.

Why it mattered

Fuel, crews, capital and equipment are finite. The question was never how to collect telemetry, it was which of 15,000+ sites deserved attention next, and where that attention would create the most value.

What changed

Real-time systems processing tens of millions of telemetry and alarm events a day across 15,000+ sites, with the Smart Generator Optimisation work contributing approximately R1 billion in annual operational savings.

OptimizationReal-Time StreamingTelemetryProduction MLDecision SystemsTechnical Leadership
Explore the work
Climate forecasting and geospatial ML at IBM Research: Turning environmental data into something people can use
Research

Turning environmental data into something people can use

Satellite, climate and environmental data is too large to treat as an ordinary dataset. The work was making it into information researchers, businesses and decision makers could act on.

Why it mattered

Research only matters here if it reaches a system someone can use. That meant designing models and workflows for data far beyond a single machine, then getting them into a platform.

What changed

Climate-forecasting models deployed into IBM PAIRS Geoscope, an enterprise geospatial-temporal platform handling petabyte-scale data, plus a co-authored NeurIPS 2020 workshop paper.

Geospatial AIRemote SensingApplied ResearchClimate RiskDistributed Computing
Explore the work
Student success analytics and recommendations at Wits: Using data to help students and a university decide
Education

Using data to help students and a university decide

A university holds a great deal of data about how students are doing. The work was turning it into something faculties and support staff could act on, early enough to matter.

Why it mattered

Institutional data that is only reported is not much use. The value is in earlier visibility, so support reaches a student before a problem becomes terminal, and in leaving the skills behind.

What changed

A clustering-based recommendation system for the Faculty of Humanities, with more than R2 million a year in government subsidy impact attributed to the initiative, and analytics and ML workshops for staff and students.

Recommendation SystemsApplied ResearchAnalyticsAI Education
Explore the work
Decision support systems for municipalities at the CSIR: Helping municipalities see where service delivery breaks
Research · Decision support for municipalities

Helping municipalities see where service delivery breaks

Public-sector data existed but was hard to act on. The work was building decision-support systems that gave municipal stakeholders operational visibility they could plan against.

Why it mattered

Municipal decisions affect service delivery for residents. Value here is not revenue, it is planning that is better informed than it was.

What changed

Django-based decision-support systems serving 17 municipalities, including the City of Cape Town and 16 across Gauteng, with real-time access to analytics for public-sector stakeholders.

Applied ResearchAnalyticsDecision SystemsPublic Sector
Explore the work
Kasilam: teaching township youth to build with AI: Teaching people to build for themselves
Community

Teaching people to build for themselves

Township businesses can’t afford agencies and township youth aren’t taught the skills that now pay, so Kasilam teaches people to build with AI by doing real work.

Why it mattered

Building everything for people creates dependency. Transferring the capability changes what they can do next: a website helps once; knowing how to build the next one is the thing that lasts.

What changed

A growing set of real sites shipped for local businesses at no cost, built by participants learning to earn with AI, not built by me.

AI EducationCommunityCapability BuildingApplied AI
Explore the work
AI education: FabAcademic Unfiltered and LeparaLaMapara: Making practical AI knowledge easier to reach
Community

Making practical AI knowledge easier to reach

Most people meeting AI for the first time get either hype or a research paper. This is the work of explaining what is actually true about building with it, in public.

Why it mattered

Practical AI literacy is unevenly distributed, and the gap is widest where the opportunity is largest. Explaining the real engineering, plainly, is the cheapest way to move it.

What changed

Co-hosting FabAcademic Unfiltered with Prof. Mamokgethi Phakeng, with sessions reaching audiences of over 300,000 people, alongside public technical writing.

AI EducationApplied AICommunityTechnical Leadership
Explore the work

Much of this starts the same way: hit a problem, work out why it keeps happening, solve it once, then try to make the solution useful beyond me.

The research behind some of it has its own pages under Research, and everything here is also gathered by subject under Topics.