A blank repository
Greenfield builds where nothing exists yet — structure, stack, conventions, deploy. I have started from zero often enough to enjoy it.
Ten years building for the web. I make the thing, and I make it work with everything around it.
Build
Websites, shops, web apps, learning platforms, internal tools and ERP — from the empty repository to the thing running in production.
Connect
Payment and banking gateways, courier APIs, fiscal cash registers, product feeds, CRMs and search — made to behave as one system.
Automate
The manual steps nobody budgeted for: dashboards, workflow tooling, and language models placed where they actually remove work.
Greenfield builds where nothing exists yet — structure, stack, conventions, deploy. I have started from zero often enough to enjoy it.
Gateways, courier APIs, fiscal devices, product feeds, CRMs. The work nobody demos, that everything else quietly depends on.
Pricing, stock, invoicing, fiscalisation. Domains where "mostly working" and "broken" are the same answer.
The same product across brands, locales and regions — without quietly forking it into ten codebases nobody dares change.
Search and faceted filtering over large catalogues and document sets, so people stop scrolling and start finding.
Inherited projects nobody wants to touch. Taking them over, making them safe to change, and living with them for years.
How it fits together
Build the piece. Connect it to whatever it has to talk to. Automate the step nobody wants to keep doing by hand. Same sequence, every project — only the pieces change.
How I work
Before a line of code, I want to understand the domain the way the business does — the fiscal rules, the warehouse process, the sales floor. Most "edge cases" turn out to be things a five-minute domain conversation would have caught.
Schema, contracts and boundaries get decided on purpose, early — what owns which data, how a change is meant to fail. Copying the last project's structure means inheriting its problems too.
Claude and Cursor are in the loop on almost everything I build — but the loop has tests, review and cost/latency budgets in it. Prompting is a skill; shipping still needs the rest of engineering.
Thirty-plus clients over the years, across a wide range of domains: small and medium changes to existing codebases, and entirely new builds from scratch. Online shops, custom CMS plugins, learning platforms and blogs — and the direct client conversations that came with every one of them.
Delivery for a rotating roster of clients, usually alone or in a pair, with fixed deadlines and a different stack almost every project. Restaurant ordering platforms with kitchen back-offices, online shops, government agency websites, and an ERP covering stock, orders and invoicing.
Three and a half years inside one of the world's largest marketing groups, on the platforms of a multi-brand manufacturer: ten-plus brand sites across six-plus markets, carrying more than 100k visits a month. Ten to twenty developers across several teams, and the one people came to when something wouldn't behave — worked with world-known enterprise clients throughout.
Build
Ten years · everyday work
Blogs, shops, web apps and learning platforms — designed, built, integrated with whatever the client already ran, then supported for years.
Public sector
Several public-sector sites for government agencies, built to procurement and compliance rules that a typical marketing brief never mentions.
Agency · operations
Stock, orders and invoicing where the numbers had to be right — schema designed from scratch, built and owned end to end.
Fiscal hardware
Orders arrived by e-mail and got re-typed into the till by hand. I wired Eltrade fiscal devices straight into the WooCommerce shop — order → fiscal registration → printed receipt → kitchen, no re-typing.
Connect
Enterprise · under NDA
Legacy brand sites, each built its own way, migrated onto AEM with shared components, Salsify for product content and Algolia behind search.
Enterprise · search
Search and faceted filtering across brand sites, plus internal search and document sharing for the people working behind them — all on Algolia.
Automate
Current · internal tooling
A sales team running on spreadsheets and memory. A KPI dashboard, and a win-back calling tool that drafts each script from that customer's own order history.
Current · internal tooling
A Claude–Freshdesk integration built on Agent Skills — the manual triage step just went away.
Languages
CoreJavaScript · TypeScript · PHP · SQL
Also handyBash · HTML · CSS / SCSS · Python · Lua
Frontend
CoreVue 3 · React · Tailwind
Also handyPinia / Vuex · Web Components · Stencil · Alpine.js · Bootstrap · jQuery · Vite · Webpack · Storybook · Electron
Backend & data
CoreNode.js · Laravel · MySQL
Also handyNestJS · PostgreSQL · Redis · GraphQL · REST APIs · Schema design · Queues & cron
Platforms
CoreAEM · BigCommerce · WordPress
Also handyWooCommerce · Salsify (PIM) · Freshdesk
Search
CoreAlgolia
Also handyFaceted filtering · Index design · Internal / document search
Integrations
CorePayment gateways · Eltrade fiscal devices · Courier APIs
Also handyBanking gateways · CRM / helpdesk · Email & marketing automation · Timesheet systems · Product feeds
Infrastructure
CoreDocker · CI/CD · Git
Also handyNginx · Apache · SSL · Linux · VPS / hosting · DNS
AI
CoreClaude API · Agent Skills · Tool calling
Also handyClaude Code · Cursor · GitHub Copilot · Structured output · Prompt iteration · RAG · Local LLMs (Ollama) · Token & cost tuning
Working
CoreCode review
Also handyAgile / Scrum · Jira / Confluence · Figma · Onboarding devs · Setting conventions
What I'm pointed at right now: working out where language models genuinely belong in a product, rather than where they merely demo well.
Researching
Orchestrating several agents across a longer piece of work — planning it, and passing enough context between them that the thread survives.
Experimenting
How much holds up off the cloud — comparing local models, and retrieval over my own data to see where the quality actually falls off.
Building
Opinionated, aimed at the tasks every project repeats, and designed to be generated rather than typed. Early, and deliberately quiet about it.
Learning
Structured output, prompts tuned against real inputs, and cost that stays sane — the unglamorous half that decides whether a feature ships.