Zelly Studio
A pay-monthly web design and hosting service for small businesses across the UK - the marketing site, the customer portal and the admin area behind it.

Project Overview
Zelly is a subscription web design service I founded in October 2025. Small businesses pay monthly for a site that is designed, built, hosted and maintained for them, rather than paying several thousand up front and being left to look after it themselves.
It is a business rather than a client project, so I own every part of it - the branding, the pricing, the sales, the support and all of the engineering. Ten or more clients have been onboarded to date, and all of them remain on active monthly subscriptions.
What It Does
One Next.js application serves three quite different audiences. The marketing site covers the home, services, pricing, how-it-works, FAQ and blog pages, along with per-city landing pages for local search. Its contact form is the top of the funnel - a submission is stored, an auto-reply goes out to the enquirer, and the studio is notified.
The customer dashboard shows each client the state of their website, their subscription, their invoices and their plan options. What a customer sees is derived from their subscription rather than a status column somebody has to remember to update - a cancelled subscription shows as offline, a past-due one as a payment problem, and a live site as live.
The admin area is just for me: every customer, every website, every enquiry and an overview of billing, so I can see the state of the whole business on one screen.
Technical Implementation
The application is built with Next.js 16 and the App Router, written in TypeScript and styled with Tailwind CSS. Data lives in Neon Postgres, accessed through Drizzle ORM with generated migrations committed to the repository.
Authentication is handled by Neon Auth, built on Better Auth. There is deliberately no row-level security - ownership is enforced in application code and centralised in a single queries layer, so there is one place to audit rather than a policy spread across the database.
Billing runs through Stripe, with a daily sweep that reconciles subscription state and reports its own health. Transactional email goes through Resend behind a single wrapper, so a delivery failure raises an alert instead of vanishing silently. The contact form is protected by Cloudflare Turnstile.
The database has three long-lived branches - production, development and test - which are never interchangeable, so tests can run destructively without any risk to live customer data. Unit and integration tests run in Vitest and browser tests in Playwright. The whole thing is deployed on Vercel in the London region.
