Full-Stack Engineer · Agentic AI & LLM Systems · Python Backend
Building production systems where the model is a component, not the product.
I design and ship end-to-end products: async Python services on the backend, typed React front ends, and LLM-powered agents wired into both. Most of my work sits at the seam between conventional software engineering and applied ML - retrieval pipelines, tool-using agents, evaluation harnesses, and the unglamorous infrastructure that keeps them reliable in production.
- 🧠 Agentic AI & LLMs - RAG pipelines, tool calling, multi-step agents, structured output, prompt and eval workflows
- ⚡ Async backends - FastAPI and Django services built for concurrency, streaming, and long-running jobs
- 🧩 Full-stack delivery - React and Next.js front ends against clean, versioned APIs
- 🧪 Test-driven by default - the test suite is the specification; CI is the gatekeeper
- ☁️ Cloud-native - containerised workloads on AWS and GCP, deployed through GitHub Actions
Languages
AI / ML
Backend
Databases
Frontend
Infrastructure
| Area | What that looks like in practice |
|---|---|
| Agentic systems | Planner/executor loops, tool registries, guardrails, retries and fallbacks, token and cost budgeting |
| RAG & retrieval | Chunking strategies, hybrid search, re-ranking, grounded citations, offline eval sets |
| Async APIs | asyncio end to end - connection pooling, backpressure, SSE/WebSocket streaming, background workers |
| Data & ML | Feature pipelines, model training and packaging, batch and online inference, drift monitoring |
| Polyglot persistence | Schema design and query tuning across PostgreSQL, MySQL, MSSQL, and MongoDB; picking the right store per workload |
| Product front ends | Next.js App Router, server components, streaming UI for token-by-token responses |
| Delivery | Trunk-based development, GitHub Actions CI, containerised deploys, IaC, observability from day one |
- Tests first. Red → green → refactor. Unit tests for logic, integration tests against real dependencies in containers, contract tests at service boundaries.
- Types everywhere. Pydantic and
mypyon the Python side, strict TypeScript on the client. - Async where it earns its keep. Concurrency for I/O-bound work; no ceremony where a synchronous path is clearer.
- Small, reviewable commits. Conventional Commits, linear history, every change traceable to an issue.
- Boring infrastructure. Reproducible builds, pinned dependencies, one command to run the stack locally.
- Observability is a feature. Structured logs, traces, and evals shipped alongside the code they measure.

