03

Builds · 2024 to 2026

What I build, and how

"AI-powered" means nothing on its own. Here is what I built, the decision behind each one, and where I stop trusting the output.

Built
B-01 TypeScript · Next.js · about 40,000 lines · 216 tests

A four plant glass network and the operations platform that runs it

Four plants, eight furnaces and eighteen forming lines, simulated in fifteen minute ticks, with more than thirty screens a plant would run them from: control room, shift report, quality holds, planning, cost to serve, emissions.

Every number had to be arguable. Nothing in it is random, so a plant manager who disagrees with a figure can be shown the assumption behind it and watch it change, and the tests check that the numbers reconcile, glass in against glass out. The question router on top scored 22 of 22 on questions written alongside it and 0 of 12 on the first set someone else wrote. The zero is the number I quote, because nobody tuned it. The domain model comes from four years in a plant like this, and that is the part I could not have bought.

B-02 Next.js · Supabase · Claude · closed source

Vera, a CSRD reporting platform that became a company

Takes an organisation through a double materiality assessment and out to the reporting output. Built from the framework in my thesis, co-founded with two others, running in demo and live modes.

The platform works in full with the AI switched off. The model is layered on for gap finding and drafting, behind guardrails that stop it inventing a disclosure. Every call is metered, so the running cost is a tracked budget line. A compliance tool that can fabricate is a tool nobody will sign.

B-03 React · deterministic solver · Claude engine behind a flag

A timetabling agent that flags what it is unsure of

Assigns faculty to a master's programme timetable against language, availability, workload and cross programme constraints, and shows the score behind each assignment so a coordinator can override it.

The demo runs a deterministic solver in the browser: free, and the same answer on every load. The first engine handed the whole problem to Claude at about five cents a run. The other decision is the hard cases: where the pool is thin or the constraints conflict, it labels the assignment for review, or as a gap, and hands it to the coordinator with the ranking visible. The first release was cut back to that after scoping with the timetabling staff.

Also This site, on Astro with Claude Code, no framework and no external requests. Messaging agents on the Anthropic API and Twilio, a Claude driven paper trading system against Alpaca, a group holiday planner, deadline and reporting automations. About 200,000 lines across twenty repositories since 2024.

The method

I noticed this on group projects during the MSc. Same tools, about the same total time, different results. Classmates asked for deliverables straight away. I spent longer on the background first: what this is, why it exists, what I need out of it, what the constraints are. The work after that was faster and I usually finished first.

Ambiguity in the input turns up in the output, where it is harder to see. Front-loading the context is the same job as scoping a project before anyone builds anything.

Where I stop trusting it

I learned to structure problems, and worked in industry, before any of this existed. So I know how I would do the job by hand, I can tell the model to do it that way, and I can usually tell when an answer is fluent and wrong. The output is confident either way.

The closest call so far was in Vera. A sample report button meant for demo mode was reachable from the live workspace, and it would have written an invented greenhouse gas inventory into a real report: a Scope 1 figure to the tonne, "verified by Bureau Veritas", a materiality table, all formatted, none of it true. Code review caught it and it was gated. That is why nothing a model writes carries a client's name without a person signing it.

It does most of the typing and I am not going to pretend otherwise. What I bring is the framing, the call on which output to trust, and enough domain background to specify the problem properly. Analysis is cheap now. Choosing what to analyse, and owning the answer, is the paid part.