Work
Things I’ve shipped
Shipped products — some live, some personal tools I use daily. Each write-up describes the problem, what was built, and the reasoning, including what was deliberately left out.

An editorial directory for a category that didn't have one.
A live directory of the UK's wood-fired and outdoor sauna scene — operators, builders, and practical guides. The interesting decisions were the ones about what to leave out.
- 277
- operator listings
- 68
- wood-fired builders
- 11
- published guides

Knowledge Inbox OS
In use · local-firstTurn a pile of private documents into something you can ask questions of — with the privacy boundary designed in from the first line.
A reusable system that reads a folder of mixed documents and email, answers plain-English questions from your own material, and drafts replies in your voice. Proven across two unrelated collections without changing a line of core code.
- 4
- unrelated corpora proven
- 1
- shared codebase
- 0
- private data committed

AI training presentation
In productionA presentation about AI that proves the point by running real AI live, in the room.
A browser-based interactive presentation for non-technical business audiences, with working AI demos embedded in the slides. The engineering that matters is invisible: every live demo has a silent fallback, so a flaky network never becomes a failure in front of a room.

Household finance dashboard
In daily use · privateA production tool I actually depend on — and a worked example of keeping AI well away from the data that matters.
A finance dashboard I built for my own household and use daily. No database — the data layer is plain YAML files, kept local and never committed. The interesting parts are the constraints: a demo mode that can never leak real numbers, and an AI advisor that's allowed to read but never to decide.
- 13
- YAML data sources
- Daily
- in real use
- 0
- real figures shown

Running the chain on a real engagement
External engagement · anonymisedThe diagnostic pipeline, used end-to-end on a live external piece of work — not a demo.
I ran the full diagnostic chain for a solo founder repositioning a direct-to-audience personal brand: intake, cited research, a five-voice debate, three specialist reviews, and a strategy synthesis they could act on. Anonymised by design — what's shown is the shape of the work and the judgement behind it, never the contents.
- 5
- voices in the debate
- 3
- specialist reviews
- 0
- client details shown

Linen calculator
Delivered · commercial pieceA fragile spreadsheet turned into a dependable, can't-break tool — built fast, hardened for real use.
A small commercial piece for a holiday-let business: their weekly linen-prep spreadsheet, rebuilt as a single offline web app that a non-technical person can't accidentally break. One HTML file, no install, no internet. The story is speed, completeness and reliability on a real business problem — not technical complexity.
- 1
- HTML file — the whole app
- 0
- dependencies or build step
- Offline
- no server, no internet

The Great Howl
Self-initiated conceptA complete artist brand, generated end-to-end with AI — and deliberately held back from looking like it.
A self-initiated concept: an entire alternative-folk artist — music, imagery, brand, copy and a storefront — generated end-to-end with AI, then deliberately held to one cohesive aesthetic rather than the default AI look.
- Suno
- all music generated, none licensed
- AI
- every image generated — no stock
- 1
- person, end-to-end: music to brand to store

Credentials library
Working tool · demo uses synthetic dataDrop credential documents in a folder — get a structured, searchable record of what the firm has actually done.
Every services firm has the same problem: the evidence of past work lives in scattered documents, so every proposal re-discovers it from scratch. This tool reads credential documents in any format, extracts a consistent taxonomy from each, and makes the whole library filterable and searchable. Shown here with an entirely fictional firm's credentials.
- 5
- fields extracted per credential
- 3
- file formats ingested (md · docx · pdf)
- 0
- real client data in the demo
![Excerpt from the British Land plc demo brief: five claims from the verified-signals registry, each carrying a verification label — [V] verified, [P] partly verified, [U] unverified](/images/meeting-prep-brief.png)
Meeting prep with a verification layer
Working internal workflow · demo run on public-listed-company dataCompany and context in — a one-page, sourced briefing note out, with every claim labelled by how well it is actually supported.
Meeting preparation is where confident summaries quietly go wrong: a stale story reads as current, a rumour reads as fact, a marketing line reads as a credential. This internal workflow researches a company from public sources and labels every claim — verified, partly verified, inferred, or unverified — before it can reach the briefing note. Demonstrated here on a FTSE-listed company, where the labels did real work.
- 4
- verification labels a claim can carry
- 2
- axes — is it true × what it means for us
- 0
- unverified claims allowed to read as fact

Job-scan — a weekly market radar
Running weekly · autonomousOnce a week, an automated scan reads the director-level job market and tells me honestly how well I'd fit — including when the answer is badly.
A passive radar, not a search tool: I'm not looking for a job, which is precisely when you stop seeing the market. Every Sunday it gathers listings through official APIs, filters them against hard constraints with the reason stated for every drop, has an AI score the survivors for honest fit, and sends a short digest to my phone.
- 53 → 10
- first live run: raw listings → candidates
- 24
- tests, CI-gated
- 0
- scraping — official APIs only

Mobile capture — phone to workspace, intact
Running always-on · in daily useA thought sent from my phone lands once, unmodified, in the workspace inbox — and the system asks me about it at the start of the next session so I never have to remember it exists.
Ideas arrive away from the desk, and friction is what kills capture. This service turns a private Telegram chat into a capture channel: text, photos and documents land as files in the workspace inbox within seconds, exactly once each, with interpretation deferred until I'm back at the desk. It has run always-on since the end of June.
- 1
- file per message — idempotent by update id
- 3
- capture kinds: text · photo · document
- 23
- tests, CI-gated