It runswithout me.
Sole engineer on a recruitment-intelligence platform that keeps 40,000+ records current across six national networks, twice a day, with nobody watching.
- 40,000+
- 8
- 2×/day
Python · Java · TypeScript · JavaScript · C++ · C · PHP · SQL · Swift · Dart
Spring Boot · Spring Security · JPA/Hibernate · SQLAlchemy · REST API design · PostgreSQL · MySQL · SQLite · Redis · Flyway
LLM application design · Autonomous agents · Multi-agent orchestration · Prompt and pipeline engineering · PyTorch · TensorFlow · OpenCV
Next.js · React · Node.js · Express · Flutter · SwiftUI
Docker · Docker Compose · Linux VPS · Cloudflare Workers · Vercel · Git · Playwright automation
01
Systems people depend on.
Two current engagements, and what I owned in each. Under the first two: the decision I made, and the alternative I turned down for it.
A recruitment-intelligence platform I am the only engineer on. An LLM agent sits on top of a Python and Playwright acquisition layer that keeps 40,000+ agent records current across six national franchise networks — twice a day, with nobody watching.
- 40,000+ agent records kept current
- Six national networks, eight concurrent scrapers
- Twice-daily unattended runs on a containerised VPS
- Sole engineer: architecture, schema, agent, deployment
- Roll the transaction back and alert when a run reports an implausible departure rate.
- Trusting the scrape, and letting one upstream failure quietly corrupt 40,000 records.
A platform connecting specialists and parents across a multi-branch rehabilitation clinic chain: a Java 25 and Spring Boot 4 backend with six user roles, a Flutter client, and separate deployments per country so regulatory boundaries stay real.
- Six role types, audited cross-branch transfers
- OTP-to-JWT on Redis, Flyway-versioned migrations
- Four languages, per-country deployments
- Flutter client with Riverpod and go_router
- Separate deployments per country, so regulatory separation is enforced by infrastructure.
- One database with a country column, and a promise that every query remembers to filter on it.
Earlier
WarCry MMORPG — Junior Game Developer
Core development team of an MMORPG. Refactored C++ game-loop and server-side systems, and automated item and mob data management in Python so database values stayed consistent with in-game mechanics. The engagement ended when the project was discontinued for budget reasons.
TNC Group — Software Engineer Intern
Completed the Software Persona professional development programme with a certificate of achievement — relational databases and SQL, JavaScript web development, UI/UX design in Figma, and Android and iOS mobile development.
Zettanium — Software Engineer Intern
PHP server-side logic and relational schema design for the company's web infrastructure — an unfamiliar stack picked up independently and delivered against inside the internship.
Freelance — Software Developer
Production web applications for clients in healthcare, education and retail — scoping with non-technical stakeholders, build, deployment and post-launch maintenance, owned end to end.
02
Built on my own time.
Self-directed work — the things I built because I wanted to find out whether I could.
Takes a request in plain language and decomposes it into a chain of ten specialised coding agents — architect, backend, mobile, QA, security, review, localisation — each running as an isolated process against a target repository.
- Deterministic keyword routing as a fallback when the router model is unreachable.
- A run that stops dead because the one component choosing the chain went down.
Node.js · Express · Server-Sent Events · LLM Agents
A pipeline that takes messy customer input and turns it into structured data: an urgency score, a category, a two-line summary. When something is urgent, the webhook and the alert e-mail go out on their own.
POST /api/v1/ingest
→ 200 · 340ms · cache miss
{
"urgency": 8,
"category": "billing",
"summary": "Card was charged twice, customer wants a refund.",
"actions": ["webhook", "email"]
}
- Made one Redis carry both the LLM cache and the per-tenant rate limits.
- A second component to rate-limit with, and a second thing to keep alive.
Chess with all its rules and no chess library — board model, move generation, check and mate detection, and a minimax search with alpha-beta pruning over a tile-based board. Java first, then ported to JavaScript so it runs in the browser. You can play it on this site.
- Wrote every rule by hand, including the legality filter for check.
- A chess library, which would have skipped the only interesting part.
NOA
A SwiftUI iOS app with LLM-backed assistant modes and live market data, kept behind a Cloudflare Workers proxy so no API key ever reaches the device.
Swift · SwiftUI · Cloudflare Workers
cents
A Next.js availability tracker with a Telegram bot that tells you the moment something you have been watching comes back in stock.
Next.js · TypeScript · Telegram Bot
I also design and build client websites: Client Work
03
Say hello.
Reach me wherever works for you — email is the fastest.
Open to remote work and relocation — visa-free Schengen travel
