Web development
Software built to be maintained, not just launched
I take projects end to end: data model, interface, deployment, handover. One person responsible for whether the whole thing works, rather than one person responsible for each part of it and nobody responsible for the seams.
Based in London, working in English and Spanish for clients in the UK, Spain and Bolivia — mostly on budgets where a recurring dollar-denominated API bill would sink the project, which shapes the technical choices more than any preference of mine does.
The service
What I build
Marketing and catalogue sites
Sites that set out what a business does, load fast on a phone on a bad connection, and can be edited by the person who runs the business. Server-rendered by default, because a site nobody can find is an expensive brochure.
Web apps with an owner-facing admin panel
Booking, scheduling and records systems where the admin view gets as much design attention as the public one. It is used standing up, in the middle of a shift, by someone who has a few seconds — and if it is awkward, the business will quietly go back to paper.
Real-time and location-aware systems
Live dispatch and tracking on PostgreSQL and PostGIS, with WebSockets for the moving parts. Where a commercial map API would bill monthly in dollars, I self-host tiles with PMTiles instead — a running cost the client can survive is part of the specification, not an optimisation afterwards.
Offline-capable tools
Service workers, a pre-cached shell and a versioned local store, so the tool keeps working when the connection does not and an update never discards existing data. Sometimes that removes the server entirely, and with it the breach, the sync and the subscription.
Bookkeeping and POS integrations
Payment, point-of-sale and ledger systems joined up so the figures reconcile without a monthly spreadsheet standing between them. This is the part most developers get structurally right and financially wrong.
Bilingual builds
English and Spanish designed in from the start — URLs, hreflang, structured data and copy written in each language rather than translated into one of them. I write both, so the Spanish is not a machine's guess at the English.
The principle
A website is not much use if the owner has to call the developer to change a price
That sentence decides most of the architecture. It is why a restaurant menu is data rather than markup, why a fixtures table is a file a volunteer can edit rather than a deployment, and why I will pick a plainer stack over a cleverer one when the plainer one is the one the client can still run in three years.
The proof is the London futsal league: six years of continuous work on one codebase, where league tables and matchweeks are updated by editing data on a Sunday night by someone who is not a developer and should not have to be. Nothing about that is technically impressive. It is just the thing that has to be true for a small organisation to keep a system alive.
Handover means handover. No retainer as a condition of the site continuing to work, and no dependency on whether I happen to be available.
The difference
The finance crossover
I also keep books for a living. Knowing what a card settlement actually is — one credit covering forty transactions, less fees, landing two days later — means I can build a payments flow that does not quietly corrupt the VAT position behind it. Knowing how a chart of accounts is used means an export that an accountant can import, rather than a CSV somebody has to fix by hand every month.
It runs the other way too. Having built systems, I can look at a bookkeeping process and see which parts are load-bearing and which are just how somebody did it once.
If the project sits across both, that is the overlap: the bookkeeping side of the practice.
In practice
Two worth reading in full
An FM radio station with a rented audience — strategy as much as build, and the one project here where the search reasoning is the deliverable rather than a property of it.
A restaurant that owns its own bookings — a five-step reservation flow replacing a platform that charged per cover.
Stack
What I work with
Languages
- JavaScript / TypeScript
- Node.js
- SQL
- HTML & CSS
Frameworks
- Next.js
- Eleventy
- SvelteKit
- Tailwind CSS
Data
- PostgreSQL / PostGIS
- Supabase
- PMTiles / MapLibre
- WebSockets
Delivery
- Service workers / PWA
- Vercel
- Static hosting
- Schema.org
Start with a conversation
Tell me what you're trying to build, or what isn't working now. We'll work out the shape of it before anyone writes code.