African football produces players the world covets.
It has never had the infrastructure to see itself clearly.
I'm building that infrastructure β open source, in Clojure, from Nairobi. The goal is a data foundation that clubs across the continent can own, inspect, and extend. Not licensed tools built for other contexts by people who have never watched football in Accra, Lagos, Nairobi, or Dar es Salaam.
Five projects. Each solves a real infrastructure gap that Python cannot address structurally.
| # | Project | What it solves | Status |
|---|---|---|---|
| 1 | pitch-pipe | StatsBomb ingestion + transducer pipeline. Zero-copy transformation, spec validation at the boundary. | β Live |
| 2 | temporal-squad | XTDB bi-temporal player state. Answers what your system knew at selection time β not just what it knows now. | β Live |
| 3 | press-logic | Tactical rules as data via core.logic. Rules coaches can read, challenge, and modify β not opaque model weights. | π¨ Building |
| 4 | formation-stream | 25Hz tracking data via core.async. Backpressure handling, real-time compactness metrics. | π Planned |
| 5 | dugout | Full-stack analytics workbench. Clojure backend + ClojureScript frontend + shared .cljc logic. | π Planned |
The problem is the same whether you are in the KPL, NPFL, CAF interclub, PSL, or the Ethiopian Premier League:
- Decisions made on data that arrived after the fact
- Pipelines that silently corrupt data for months before anyone notices
- Models coaches cannot interrogate or challenge
- Tools that live on one analyst's laptop and disappear when they leave
This is not a talent problem. It is a plumbing problem. And it is solvable.
| Problem | Python | Clojure |
|---|---|---|
| Pipeline memory | Each Pandas step allocates a new DataFrame | Transducers compose into a single pass β zero intermediate collections |
| Data integrity | Silent NaN coercion on bad data | clojure.spec validates at the boundary β bad data throws before it touches the pipeline |
| Temporal queries | Postgres overwrites history | XTDB stores valid-time and transaction-time on every fact, automatically |
| Tactical rules | Neural net confidence scores coaches can't interrogate | core.logic encodes rules as readable data β auditable, modifiable without retraining |
| Full-stack | Python backend + JS frontend = two codebases | .cljc shared logic runs on JVM and in the browser β one codebase |
- 1.5 years as BI Analyst at a capital group in Ethiopia managing data infrastructure across 8+ betting products
- Built real-time fraud detection, Grafana dashboards, and reconciliation pipelines under production pressure
- Football is in the family β my father was a professional player and development coach
- Self-taught. Nairobi. Building in public.
Primary: Clojure Β· ClojureScript Β· XTDB Β· core.async Β· core.logic Data: StatsBomb Β· SQL Β· DuckDB Β· clojure.spec BI & Viz: Grafana Β· Streamlit Β· Matplotlib Infra: GitHub Actions Β· Fly.io Β· Leiningen Β· Shadow-cljs
- Football analytics roles across Africa and globally
- Clubs in CAF competitions serious about data infrastructure
- Federations building analytics capacity from the ground up
- Academies tracking player development over time
- Any league β KPL, NPFL, PSL, EPL, wherever the problem is real and the will to solve it exists
- Freelance data infrastructure contracts
- Open source collaborators who care about African football
"Data isn't just numbers; it's the 12th player on the pitch." β Dennis Gathu