Systems I've built
Five systems, each written up as the problem, the architecture, the trade-offs I made, and what I would change. One is client work running in production; the other four I built to get to the bottom of something: streaming and warehouse modelling, tenant-isolated retrieval, cold-start recommendation, and inference on a microcontroller.Backend and AI
Multilingual, multi-tenant RAG engine
Several tenants on one deployment with fully isolated retrieval. The tenant claim lives in the JWT rather than the request, because cross-tenant retrieval is a security bug rather than a quality one. Local embeddings, grounded answers with citations.
The hard partCross-tenant retrieval is a security incident, not a bad answer. The tenant claim had to come from the verified JWT, so a client can never ask for someone else's documents.
Hybrid recommender, built as a service
A recommender with the parts that usually get skipped: cold start handled by design, training and serving separated by an artifact, hot model reload without a deploy, and an evaluation that reports its own sample size.
The hard partSwapping a retrained model without dropping traffic. Hot reload inside the running service, version skew and reload safety handled there rather than by a deploy.
Data engineering
Real-time e-commerce ETL pipeline
Kafka into Spark Structured Streaming, raw Parquet in bronze, batch stages into silver and gold, landing in a four-table star schema. The medallion split exists so that a change to what revenue means is a rebuild, not a backfill.
The hard partWhen the definition of revenue changes, gold has to be rebuildable from silver without re-ingesting a single event. That is what the medallion split is buying.
Autoencoder compression for edge devices
Bandwidth, not compute, is the binding constraint on a remote sensor. The encoder runs on the microcontroller through TensorFlow Lite Micro at 7.8:1, and a Flask decoder on EC2 reconstructs the signal server-side.
The hard partThe encoder had to fit in flash beside the application on microcontroller-class hardware and still cost less power to run than the bytes it saves to send.




