userjuma.store — Nairobi, KE
SMITH
JUMA

Full-Stack Dev · Data Scientist · ML Engineer — building production systems from Kenya

SJ
Smith Juma
📍 Nairobi, KE
Status
Available

Open for freelance, health-tech & ML collabs.

About Me

I build full-stack systems and ML pipelines — from Kenya-specific production software to reinforcement learning agents that play video games.

I think in systems, ship in Python, and occasionally summit mountains.

Stack
Backend
PythonFastAPIPostgreSQLDocker
Frontend
ReactTypeScriptTailwind
Cloud & Infra
AWS RDSNginxLinux VPS
ML / Data
PyTorchscikit-learnXGBoostRL
7
Summits. The goal.
In progress.
Beyond Code
🏹Bow hunting
⛰️Seven Summits
🃏Poker
🎵Capital STEEZ
"
01 — FEATURED
OptIVision

Full-stack optical clinic management system built for Kenya — SHA insurance, KRA receipts, MCK registration, Africa's Talking SMS, Kiswahili prescription slips.

PythonFastAPIPostgreSQLDockerNginx
02
NeuroClaw

Telegram AI agent on the OpenAI client library.

PythonTelegramLLM
03
Urban Twin

ML hackathon — business viability scores for Montgomery, AL.

XGBoostMapboxReact
04
NFS RL Agent

Reinforcement learning + computer vision agent trained to play Need for Speed: Most Wanted Black Edition.

PyTorchComputer VisionRLPython
GitHub
Loading repos...
BLOG

Thoughts on systems, ML, and shipping software from Nairobi.

Most tutorials start with routes. I started with the schema — here's why that decision saved the entire project.

From foreign key ordering bugs to Nginx proxy configs — a no-BS deployment journal.

Computer vision + reinforcement learning applied to NFS: Most Wanted. Early progress, honest struggles.

← Back to Blog
MAY 2025 · 5 MIN READ
Building OptIVision: Why I Started With the Database

Most tutorials tell you to scaffold routes first. I did the opposite — and it's the reason OptIVision didn't collapse under its own weight.

The foreign key problem

With 12+ interconnected tables, your schema is your architecture. I hit a foreign key ordering bug in init.js where tables were created before their dependencies.

-- Wrong: referencing a table before it exists
CREATE TABLE prescriptions (
  patient_id UUID REFERENCES patients(id)
);
-- patients table created AFTER this line

What I learned

Draw entity relationships before writing any application code. For a Kenya-specific system — SHA codes, KRA PINs, MCK registration numbers all linking correctly — the schema is the product.

← Back to Blog
APR 2025 · 7 MIN READ
Deploying Docker on a Truehost VPS: What Nobody Tells You

Deploying to a VPS sounds simple until you're staring at a 502 Bad Gateway at 1am. Here's the unfiltered version.

The init.js ordering bug

Docker Compose doesn't guarantee database tables are created in dependency order. Silent failure that only surfaces on first insert.

Nginx reverse proxy

location / {
  proxy_pass http://app:8000;
  # NOT http://localhost:8000
}

Containers communicate by service name inside a Compose network — once you internalize that, everything clicks.

← Back to Blog
MAR 2025 · 6 MIN READ
Teaching an RL Agent to Drive in Need for Speed

The goal: an RL agent that plays NFS: Most Wanted Black Edition using computer vision for state perception.

The state space problem

import cv2
frame = cv2.cvtColor(raw_frame, cv2.COLOR_BGR2GRAY)
frame = cv2.resize(frame, (84, 84))

Reward shaping

Defining a good reward function is harder than the model. I'm reading pixel color values from screen regions as a road/off-road proxy since I don't have game internals access.

GET IN
TOUCH

Have a project in mind? Let's talk.

Something went wrong. Please try again.
Message Sent!

Thanks for reaching out. I'll get back to you within 24 hours.

Direct
✉️
Email
jumabillsmith@outlook.com
📍
Location
Nairobi, Kenya — Remote OK
Response time
Usually within 24 hours