Hi, I’m Saaim. I build software that keeps working when a lot of people use it.
Open to full-time roles, remote or relocationBased in Lahore, working European and US-East hoursBackend, distributed systems, and data engineeringAvailable now
Systems I’ve built
Not screenshots. Each one is a write-up: the constraint that actually bound, the architecture it forced, the trade-off I made with my eyes open, and the thing I would build differently now. Read one and you know how I think about a system.Fitter Health: a production platform, built from zero
A Spain-based health team had a validated concept and no engineering function. I built the platform and took it to production alone: entitlements and credits, two-sided booking, invoice reconciliation with Odoo, and the AWS estate under it. Handed over documented.
The hard partSNS fanned out to the notification consumers with no durable buffer, so a failed delivery vanished without raising anything. It surfaced as a product complaint, not an alert.
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.
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.
“He frequently delivered ahead of scope and raised considerations we had not thought to ask about.”
Technical skills
Grouped by what the work is for rather than by language. The sentence is the part that matters; the logos are there for whoever is scanning for a keyword.Architecture & distributed systems
I decide what a system has to survive before I decide what it does, because that is what the design actually has to answer to. Services split across pods and scaled on throughput, fan-out buffered through durable queues with dead-letter paths, event-driven workflows, REST contract design, multi-tenant isolation, and medallion and star-schema data modelling.
- System design
- Event-driven
- Kubernetes
- Multi-tenancy
- REST contracts
Languages
I write backend, data and ML work in Python, and everything the user touches in TypeScript, so one person can carry a feature from the screen to the query. Strong SQL: window functions, query plans, and the indexes that decide whether either one finishes.
- Python
- TypeScript
- SQL
- JavaScript
Backend & APIs
I build the part of a product nobody sees and everybody depends on: accounts, permissions, payments, bookings and integrations, designed to hold up as traffic grows. Django, DRF, FastAPI, Flask and Node.js/Express, including real-time features over WebRTC.
- Django
- Django REST Framework
- FastAPI
- Flask
- Node.js
- WebRTC
- Celery
Data Engineering
I build both batch and streaming pipelines, and model the warehouse they land in, so reporting stops disagreeing with itself. Kafka into PySpark Structured Streaming, orchestrated with Airflow and MWAA, processed on EMR and catalogued with Glue, landing as a star schema over a medallion architecture that can be replayed when a definition changes.
- Apache Kafka
- PySpark
- Apache Airflow
- MWAA (managed Airflow)
- Amazon EMR
- AWS Glue
- Star schema
- Medallion
Cloud & DevOps
I set up somewhere for a product to live that won’t fall over, won’t leak data, and deploys itself from the repo. Production AWS across Lambda, EC2, ECS, EKS, S3, RDS, SQS and SNS, IAM, VPC and ALB, containerised with Docker, orchestrated on Kubernetes with autoscaling policies, and shipped through GitLab and GitHub CI.
- AWS
- Amazon ECS
- Amazon EKS
- Kubernetes
- AWS Lambda
- Amazon RDS
- Amazon S3
- Amazon SQS
- VPC
- IAM
- Docker
- GitLab CI
Databases
I put the rules in the database rather than the form, so bad data cannot get in through a path nobody remembered. PostgreSQL as the default, including pgvector for retrieval, MongoDB and DynamoDB where the access pattern earns it, and Redis for caching and as a Celery broker.
- PostgreSQL
- pgvector
- MongoDB
- DynamoDB
- Redis
AI & ML
I build AI features you can check: a chatbot that answers from your own documents and shows where the answer came from, and recommenders that handle a brand-new user by design. RAG, multilingual embeddings and recommender engines with scikit-learn and TensorFlow, down to TensorFlow Lite Micro for on-device inference.
- RAG
- Recommenders
- pgvector
- scikit-learn
- TensorFlow
Frontend
I build the screens people actually use, so the product ships as one thing rather than a backend waiting on someone else. React and Next.js, Angular alongside the frontend team at Expertflow, with clean, accessible, responsive HTML and CSS.
- React
- Next.js
- TypeScript
- Angular
Testing & quality
I make it hard to break the thing quietly, which is what lets a product keep shipping after I hand it over. Automated test suites running in CI, database-level integrity constraints, clean reversible migrations, and structured logging with request tracing.
- pytest
- CI/CD
- GitHub Actions
- Migrations
How I work
Six habits that survived contact with production, each one bought with a specific failure.Design the failure path first
Before I build a feature I write down how it breaks. The notification pipeline on Fitter Health taught me that expensively: fan-out with no durable buffer drops messages silently, and because nothing errors, nothing alerts. Now a queue gets its dead-letter path before it gets traffic.
Constraints in the database, not the form
Application-level validation is a convenience, not a guarantee. If an invariant actually matters it belongs in a constraint or a transaction, because sooner or later someone writes a management command that never touches your serializer.
Small deployable slices
Every change ships tested and deployed rather than accumulating on a branch. Working alone, this is the only thing standing between you and a three-week integration you cannot debug.
Handover as a deliverable
Fitter Health was handed over documented, with infrastructure the client can rebuild without me. “Can someone else run this” is part of done, not paperwork afterwards.
Read the system before changing it
Inherited code gets a written assessment first: what is solid, what is fragile and load-bearing, and what each change costs. Guessing is how you break the thing that was quietly holding everything together.
Measure before you scale
Scaling is a measurement problem before it is an architecture problem. An admin endpoint at Expertflow went from 130 ms to 30 ms on a Redis cache and two indexes, which no number of extra replicas would have bought. Once the cheap wins are gone, then you split the services across pods and let the autoscaler follow the traffic.
Algorithms in the open
Most interview loops open with an algorithms round. Mine is public, and has been for a long time.Structures, implemented not imported
Arrays, linked lists, stacks and queues, binary trees, tries and graphs, each written from scratch. Knowing what a dict costs you, and when a heap beats a sort, is the same instinct that decides whether a query needs an index or a rewrite.
Algorithms with the reasoning attached
Binary search and its off-by-one traps, merge sort, BFS and DFS, Dijkstra and Bellman-Ford, minimum spanning trees, cycle detection, topological sort, sliding window and Kadane, and dynamic programming built up from the recurrence rather than memorised.
Written to be read
Clean Python, more than one approach where the trade-off is interesting, complexity analysis on each, and test cases. The daily problems and the syntax notes live in the same repo, because the point is the reasoning, not the streak.
Certifications
Each one links to the issuer’s verification page.What I'm looking for
Backend, platform, or distributed systems roles where I own a service rather than a ticket queue. I have worked both ends of that: inside a team at Expertflow with live traffic to keep up, and alone on Fitter Health, where every schema decision and every consequence was mine. Owning the consequences is the part I want to keep.
The problems I want more of are the ones that only appear under load: partitioning and replication, back-pressure and retries, idempotent consumers, exactly the class of bug that never reproduces on a laptop. Most fluent in Python and TypeScript, across Django, DRF, FastAPI, PostgreSQL, Kafka and AWS. Going deeper on distributed data processing and retrieval right now, sitting the AWS Solutions Architect Associate exam this year, and keeping the algorithm work in the open on GitHub.
I work best on small teams where the person writing the code talks to the person who needs it, and I would rather join one with senior engineers to learn from than be the most experienced person in the room again. Open to remote roles with EU or US-East teams, and to relocating.


