Side project
In progresscrack-detector
A multi-turn AI diagnostic that interviews you before it critiques: Java 25 and Spring Boot 4.
Open to work
Applied AI Engineer · Civica · Cardiff
Applied AI engineer building production LLM systems, with the backend discipline that keeps them cheap, fast and safe
I build the systems that put AI models to work, and then prove what they cost. Nine model providers behind one interface, so an application never has to care which one answers. A spend limit that made the same four tasks 68% cheaper. Underneath it, four years of production Java, including one finance API taken from 99 seconds to under one.
caseIn progress
agent-platform
One OpenAI-compatible endpoint in front of every model, hosted or running on the desk.
The same four tasks, sent to the cheapest model that could still do them. Checked by running the results, not by asking the agents how they did.
Seven hosted services and two running on the machine itself. The application never learns which one answered.
One critical finance endpoint. The slow query was restructured rather than hidden behind a cache.
Java and Spring Boot, finance. Where the operational habits come from.
The tools in production now. Depth for the rest is one disclosure away.
Languages
Primary language: Spring Boot services, JPA, tests.
Frameworks
Finance microservices, event listeners, scheduled work.
Data & messaging
Finance schemas, query tuning, index work.
Delivery & ops
CI/CD for pre-release and production pipelines, release ownership.
Languages
Node services and every front end since 2022.
Languages
PostgreSQL: query plans, indexes, Liquibase migrations.
Read it · Ships production code · Sets the standard
Models & agents
Two different things, kept apart on purpose: models a service of mine calls at runtime, and the assistants I write code with. Both are listed because a claim about either is checkable against a repository.
Daily driver. This site and the shared backend behind it were built through it.
Local models behind agent-platform, reached from inside Docker. No key, no egress.
The /v1 surface agent-platform serves, so any existing client points at it unchanged.
What the services are written in, and what the scripts around them are written in.
agent-platform: the server, its desktop client, and the LLM proxy inside it.
agent-platform’s model-training worker, and the tooling around it.
Build, push, restart: the automation around a deploy.
Algorithms and contest work at university.
Backend first. The front-end entries are there because the same person shipped both ends of these systems.
Payroll estimation and transaction creation jobs.
Where the 99-second query lived.
The first agent-platform server, before it was rewritten in Rust.
Streaming responses and an OpenAI-compatible surface on one process.
This site, and the two others that share its backend.
Where the state lives and how it moves between services.
Payment flow: queues, retries, dead letters.
Delivery & ops
Getting it out, and knowing what it did once it was out.
Daily on GCP to develop and test; own scripts reduce image build and scaling to one command.
The parts that decide whether the rest of it can be changed safely.
Scrum and Kanban, estimation, technical-debt stories.
The other public cases. Every card opens the write-up.
Side project
In progressA multi-turn AI diagnostic that interviews you before it critiques: Java 25 and Spring Boot 4.
Open source
LiveA spend limit an agent cannot lift, and six subagents pinned to the cheapest model that holds.
What the finance API was built against, what each decision cost, and what changed.
Context
A finance microservice in a regulated domain: payments scheduled and settled against records that other services read while it works. The critical read API had degraded to 99 seconds, long past the point where the caller had given up, and the payment path itself was synchronous, so a slow downstream call held the whole request open.
Constraints
Results
Trade-off
Slower to show a result than putting a cache in front of it, and it meant reading query plans rather than writing code.
Why
A cache in front of a 99-second query hides the problem and makes the first request after every eviction just as slow. The plan showed the work being done per row; the fix was structural.
Trade-off
Eventual consistency, and a failure path that now has to be designed rather than inherited from the request lifecycle.
Why
A synchronous payment path fails whenever anything downstream is slow. Events let each step retry on its own and make the retry visible in the queue rather than invisible in a thread.
Trade-off
Every change needs a written changeset, including the trivial ones.
Why
A shared schema with hand-applied changes is how environments drift. A changeset makes the migration reviewable and repeatable in the pre-release environment first.
Trade-off
Pipeline maintenance became part of the job.
Why
The production build is derived from the same commits that passed there. Manual assembly is where a release stops being reproducible.
The public page is the summary. The detailed record is released by an issued link, one recruiter at a time.
Direct line
For a role, a contract, or a question about anything on this page. Replies come from me, not from a form.
If your mail client does not open, write to tanvoid0@gmail.com.
CV
The same facts as this page, laid out the way an applicant tracking system reads them. Built from the public record at deploy time, so it cannot fall behind what the site says.
Open the CVOpens as a document — print or save it as PDF from there. No phone number or postal address on it.
For recruiters & hiring teams
The CV above is the summary. What a link adds is the part a CV has no room for: per-engagement technical detail, certificates, degree transcripts, and the phone number and postal address the public copy leaves off. Released to one recipient at a time.
Already have a link? Open it directly; no account or sign-in is required. Opening it sets one strictly necessary cookie so the record stays open while you read it; nothing on these public pages sets any. See the privacy notice.