Most of my client work is covered by non-disclosure agreements, so this page doesn’t name clients, link to their sites or show their code. What it does describe is the kind of problem each project was and what I was responsible for. Where a technique was interesting enough, it became a post, rewritten from scratch with generic names.
Client work
Multisite platform for a financial-sector organisation
Several sites on one WordPress install: a main corporate site, a public-information site and an education portal, each with its own classic theme. Content is published from an external editorial system over the REST API, in two languages, behind a page cache, a reverse proxy and a CDN.
- REST endpoints for headless ingestion: linking language versions of posts created by separate requests, and purging all three cache layers after publication.
- A data-table block that renders XML, CSV and XLSX files as accessible HTML tables, with per-column number formats.
- A public change register that records every content change at the moment it goes live — including scheduled posts and scheduled revisions.
- WCAG 2.1 AA remediation and a locked-down REST API with an allowlist for anonymous routes.
WordPress Multisite · PHP · ACF Pro · WPML · Varnish · CDN · webpack · SheetJS · Highcharts
Marketing site and app backend for a consumer-lending product
A long-running site (thousands of commits) for a fintech product, which also serves web views and a JSON API to the product’s native mobile app.
- Migration from a classic theme to Sage/Acorn without breaking stored page templates or the ACF field groups attached to them.
- Around 40 ACF blocks, a loan calculator talking to the lender’s API, loaded only on pages that use it.
- Laravel-style routes and middleware for the app API, an OpenAPI spec, and a service worker with per-route caching strategies.
- Performance work on options-page data and a full-page cache that purges itself when time-boxed content starts or ends. Both are written up: ACF options, time-aware cache.
- A scripted update and deploy flow for a site where core and plugins are committed to git.
WordPress · Sage/Acorn · Blade · ACF Pro · Vite · TypeScript · Workbox · LiteSpeed · Playwright
Vacation-rental marketplace with a travel guide
A listings marketplace where property owners manage listings and guest inquiries on a paid plan, combined with a destination guide of a few thousand geolocated places.
- An owner portal as a separate Vue SPA on top of WordPress REST with JWT auth, route guards for subscriptions and field-level write allowlists.
- Subscriptions with Stripe webhooks, versioned data migrations and a WP-CLI importer with rate-limited geocoding.
- “Places nearby” search fixed with a SQL bounding box (written up here), lazy-loaded maps and cached GPX/KML downloads.
- Multi-stage Docker image and GitHub Actions deploys to a VPS behind Traefik.
Bedrock · Sage · ACF Pro · WooCommerce Subscriptions · Stripe · Vue 3 · Pinia · Redis · Leaflet · Docker · Traefik
Club platform for a global lifestyle brand
Development and maintenance of a WordPress Multisite platform with member logins, profiles, points and newsletters. I built more than 80 custom Gutenberg blocks on ACF Pro and @wordpress/scripts, with a shared build and versioning setup, and introduced code review, CI/CD and integration tests.
WordPress Multisite · ACF Pro · Gutenberg · React · PHP (OOP) · Docker · CI/CD
Headless CMS for a single-page application
WordPress as the content back end for an Angular application: a REST API serving calculators, pop-ups and translations, with TTL caching, automatic cache invalidation, custom CORS and an allowlist that keeps public endpoints working under a security plugin.
WordPress · REST API · ACF Pro · Angular · CI/CD
Loan calculator plugin for a bank
A calculator for equal and decreasing instalments that matches the bank’s own rounding (daily interest, last instalment absorbs the remainder) and computes the APR as an internal rate of return. It works as a dynamic block and as a legacy shortcode from one render path, and generates a PDF repayment schedule through a REST endpoint.
PHP · block.json · Vue 3 → @wordpress/element · TypeScript · mPDF (scoped)
Bilingual academic journal
Issues and articles as a post hierarchy with PDF previews, DOIs and citation export to BibTeX and RIS. An accessibility toolbar (contrast, text scaling, readable font) with screen-reader announcements. Decades of articles migrated from a static HTML archive with fuzzy title matching and resumable batch jobs in wp-admin.
PHP 8 · Tailwind · Polylang · ACF · WCAG 2.1
WooCommerce shop with drop-shipping
A cosmetics shop where part of the catalogue ships directly from a wholesaler. Shipping rules for mixed carts, a free-shipping threshold read from shipping zones, per-variation GTINs for product feeds, and a stock sync from the supplier’s XML feed that refuses to zero stock when the feed comes back empty.
WooCommerce · PHP · Symfony Console · cron
Beyond WordPress
- An online self-assessment platform with reports and recommendations — Vue 3, Strapi, GraphQL.
- A lightweight CRM — Vue 3, TypeScript, Python back end.
- An apartment registration flow with Stripe payments on top of the WordPress REST API.
Open work
- WordPress Blueprint — a template repository for new WordPress projects: Composer-managed core, an mu-plugin for data, a block theme, and the whole quality toolchain wired into CI. How it’s built.
- This site — a Bedrock block theme in a hardened Docker image, sharing a small VPS with another project behind one Traefik. Notes on that setup.
Want to talk about a project? I’m on LinkedIn.