What I build with
The languages, platforms, tools and practices behind SGAF, NetCall and the rest of the work on this site. Everything here is in use in my own work.
Models are named here because choosing the right one for each job is part of the skill. See also how AI is governed in SGAF.
Languages
What the code is written in.
- TypeScript
- JavaScript
- SQL
- Python
- Swift
- Bash
- HTML and CSS
Web and app frameworks
From marketing sites to the SGAF portal and native apps.
- Next.js (App Router, server components, route handlers)
- React
- Tailwind CSS
- MDX content
- React Native and Expo
- SwiftUI
Data and databases
Records that stay correct as the product changes.
- PostgreSQL
- Supabase
- Row-level security
- Schema migrations
- Cloudflare D1 and KV
- Zod validation
Public education data
The official sources behind SGAF's evidence.
- GIAS
- DfE Explore Education Statistics
- Ofsted management information
- Companies House
- Financial benchmarking (CFR and AAR)
- Indices of deprivation
- ONS Open Geography
Documents, files and media
Outputs a school can use straight away.
- Word documents (docx)
- PDF generation (React PDF)
- PDF and Word parsing
- Excel workbooks (ExcelJS)
- PowerPoint (PptxGenJS)
- CSV pipelines
- HTML presentation decks
- Open Graph images
- Web crawling and HTML parsing
- Headless Chromium
- ImageMagick
AI
Models inside checks, never instead of them.
- LLM APIs with structured output
- Document extraction with human review
- Redaction before processing
- Evaluation after release
- Prompt design
- AI coding agents in parallel branches
- Multi-agent operations with approval gates
Hosting and infrastructure
Where it runs, and how it ships.
- Vercel (deployments, previews, cron, secrets)
- Cloudflare (Pages, Functions, D1, KV)
- Docker
- Linux (Arch, Omarchy)
- Raspberry Pi
- DNS and email authentication (SPF, DKIM)
Engineering workflow
How changes are made, reviewed and shipped.
- GitHub (pull requests, Actions)
- Code review with a written review guide
- Independent model audits on sensitive changes
- Git worktrees for parallel work
- Visual Studio Code
- Remote development over SSH
- Preview deployments for every branch
Testing and quality
Proof before anything is called done.
- Vitest
- Testing Library
- Playwright end-to-end tests
- axe accessibility checks
- Mutation testing (Stryker)
- Property-based testing (fast-check)
- Coverage reports
- Type checking and lint
- Custom release gates
Operations and integrations
What keeps a live service healthy.
- Sentry error monitoring
- Vercel Analytics
- Resend email
- Cal.com booking webhooks
- Revolut Pay and BACS invoicing
- Uptime monitoring
- Scheduled data refreshes
- Webhooks
Security and data protection
Designed in from the start.
- Content Security Policy and security headers
- Input validation and sanitisation
- Secrets kept out of code
- UK GDPR by design
- Data protection impact assessments
- Data processing agreements
Design and making
How things look, and the physical builds.
- Design tokens and dark mode
- Accessible colour and contrast
- SVG illustration
- Canva
- 3D printing (Bambu Lab)
- AI-assisted 3D model editing
The models I work with, and what each is best at
Matching the model to the job keeps quality up and cost down. Every model sits inside tests, review or a person's approval, never instead of them.
- Anthropic
Claude Haiku
Fast, low-cost structured classification at volume, such as reading page after page against a fixed checklist.
- Anthropic
Claude Sonnet
Careful reasoning and clear writing: synthesis, checking automated results, and board-ready summaries.
- Anthropic
Claude Opus
The hardest engineering: large, multi-file changes, long investigations and difficult judgement calls.
- OpenAI
GPT and Codex
Coding agents, and a second opinion from a different model family when a change touches anything sensitive.
- xAI
Grok
Always-on routines with live web and social context, including scheduled business tasks and social publishing.
The practices that make the tools trustworthy
Decisions in writing
Every non-trivial choice gets a decision record, so the reasoning outlives the conversation.
Gates before merge
Build, lint, types and tests run in a fixed order, and nothing merges on a red gate.
A preview for every change
Every branch gets its own preview. Production only changes through a reviewed merge.
Validate, then promote
New data is built as a candidate, checked against published figures, and only then promoted.
Reasons, not black boxes
Scoring is deterministic and every flag carries the reason it was raised.
A person decides
Agents prepare and draft. A person approves every send, spend and delete.