Full-stack web
Next.js, TypeScript, and a component library on Tailwind UI that carries between projects.
Next.js, Sanity, Tailwind UI
A website is a front end, a content model, an analytics and consent layer, a data layer that feeds it real numbers, and the infrastructure underneath. Most projects buy those from different suppliers. I build all of them, which means there is nobody to coordinate and nothing to translate between.

A website is rarely one job. It needs a front end, a content model that a non-technical person can work in every day, an analytics and consent layer that is legally correct, a data layer that puts real figures on the page, and infrastructure that keeps it running.
Split across suppliers, each handoff becomes yours to manage. Three failures are close to universal: the content model is shaped around the developer rather than the editorial process, so publishing stays painful. The analytics were added after launch, so they measure what was easy to instrument rather than what the business needs. And the live figures on the page are typed in by hand, because the integration belonged to nobody.
Bought from a single agency, the failure mode inverts: a template rather than a fit, a platform you rent indefinitely, and a retainer to change your own copy.
One arrangement leaves you coordinating suppliers. The other leaves you renting your own website.
Scope
Next.js, TypeScript, and a component library on Tailwind UI that carries between projects.
Sanity, modelled around how the client actually writes rather than around the developer's convenience.
Consent, analytics, conversion events and CRM, defined before launch rather than bolted on after.
The pipelines that put real numbers on the page instead of screenshots of numbers.
Retrieval, model serving, and the judgement to say when a project does not need either.
What runs it, what it costs to run, and how it is handed over.
These are not six services to buy separately. They are why there is no coordination cost.
A demonstrator built end to end against a real store. Passes sold as service products, member entitlement held on customer metafields, a QR kiosk that resolves access live, unlocks a door and writes the check-in back to the customer record, subscriptions, and B2B equipment sold off-storefront as draft orders. Multi-site.


The subject is not the gym. It is that commerce, physical access control and entitlement logic were specified, built and handed over as one piece of work.
Two editorial versions, fifteen blocks the client edits without a developer, live campaign figures read from an API, consent-gated analytics, and structured data so AI assistants describe it correctly. Built to a fixed public date. Read the case study.

Before a recent scaleup engagement, a review of the public site alone found: a home page weighing 5.9 MB, of which 1.4 MB was a single image; the GSAP animation library loaded twice, at two different versions, on every page including those with no animation; and a hard-coded exchange rate carrying a TODO comment, on a page that already called the live rate endpoint.
No access, no credentials, no discovery workshop. Reading a site before quoting on it is the difference between a proposal and a guess.
Website costs are usually quoted as a subscription, and the subscription is the smallest part of the bill. On a recent six-language marketing site, the analysis broke down like this.
Localisation is billed per language, per month. Six languages means five secondary ones, and the incumbent platform charges for each. Past a certain page weight and traffic, bandwidth allowances are consumed and the plan changes tier. Beyond that, enterprise pricing is not published at all, so the figure on the website is a floor rather than a quote.
That is visible to the client and invisible to anyone outside, which is exactly why it never appears in a comparison.
The subscription buys the platform. It does not buy a change to the site. Every new page, every campaign landing page, every additional language is billed by whoever maintains it, and that arrangement does not end, because it was never designed to.
The recurring cost is not the licence. It is the fact that changing your own website requires buying someone's time.
The build is handed to your own engineering team. Conventional foundations they already know, in a repository they own, with a seventh language as one line of configuration rather than a quote. Marketing publishes without queueing behind engineering, and engineering changes the site without queueing behind an agency.
Hosting and subscriptions stay in your name, at ordinary published rates, because a provider who owns your hosting owns you. The fixed price below is the last invoice, not the first of a series.
Standalone. It is a decision, not a build, and buying it commits you to nothing further.
Most chosen
If the work takes longer than I judged, that is mine to absorb. And you own the result: conventional, widely used foundations, so your team can take it over without depending on me.
Two people. One technical, one marketing. You work with both.
No account manager, no junior, no subcontractor. That is what keeps the fixed prices above achievable, and it is also the limit: this practice runs few projects at a time.
No. It is a two-person practice. If you need thirty people, you need an agency, and I will say so.
Bring it. Composing from an existing component library is faster than copying a design pixel for pixel, so a redesign during the build costs less than doing it twice.
You do, in your name. Hosting and subscriptions are yours and are not included in the prices above. That is deliberate: a provider who owns your hosting owns you.
That is the point of the third option. Conventional foundations, documented, with guardrails that stop a later handover degrading the site undetected.
Yes, on Shopify. Different stack, same practice. See the champagne work.
Send the URL. I will have read the site before we speak.