Three projects live · Building now

Sites that ship, not sites that demo.

I build static websites, email infrastructure and the growth systems around them — end to end. No page builders, no $80/month subscription stack, no handover doc that rots in a drive folder.

Every project below is live right now. Click the links. Time the load. The numbers on this page were measured, not estimated.

3Live production sites, custom domains, valid SSL
0.15sSlowest median load across all three
$0Monthly software fees on every build
105Pages shipped on the largest project

Selected work

Three builds, three different problems

A campaign that needed credibility fast. A content business that needed scale. A home studio that needed bookings without leaking its address.

Website · Email · Social · Ads — end to end
Running

A private home-based braiding studio in North York, Toronto. The hard constraint: the client's home address is her business address. It cannot appear on the website, in the schema, in the coordinates, or in the booking platform's confirmation emails — it goes to a client only after a deposit clears.

So the site publishes the intersection and the nearest subway stop, rounds its map coordinates to roughly one kilometre, and ships a build script that fails the deploy if a street address or a full postal code ever appears in the output. The privacy rule is enforced by code, not by remembering.

The money side works the same way. The booking platform can't take a partial deposit — its prepayment setting charges the full service price, which on a $400 style is a non-starter. So the calendar and the cash were separated: the platform owns availability, Interac e-Transfer owns the retainer, and a manual approval step links them. Each request generates a deterministic reference code so a payment can be matched to a booking.

Load time
0.11–0.15s
Monthly cost
$0 software
Payment fees
$0 — e-Transfer
Static HTMLPython generator Cloudflare PagesJSON-LD Tally formsWhatsApp flow AVIF/WebPWCAG AA
Still open: the booking calendar isn't connected yet — the site runs the WhatsApp fallback until it is. Email isn't live on this domain either. Both are client-side steps, and I'd rather say so than imply a finished stack.
Website + email infrastructure — end to end
Live

A campaign site for a candidate for Chairman of the NMA Kaduna. One page, 25 sections and about 7,000 words — a full manifesto plus a verifiable record of service, structured so a voter can scan it in ninety seconds or read the whole thing.

Campaign sites get scrutinised by opponents, so the build has zero external stylesheets or scripts. Nothing to break, nothing phoning home, no third-party dependency that can go down mid-campaign.

I also ran the email infrastructure end to end: Cloudflare Email Routing for inbound, Zoho authorised in SPF for outbound, and a DMARC record with aggregate reporting pointed at a live mailbox — so campaign mail lands in inboxes instead of spam, and anyone spoofing the domain shows up in a report.

Load time
0.15–0.24s
External requests
Zero
Mail
SPF · DKIM · DMARC
Single-page7,000 words Self-hosted CSSCloudflare Email Routing Zoho MailDMARC reporting
Editorial affiliate build — content, SEO, email, infra
Paused

An editorial affiliate publication — 105 pages and roughly 72,000 words across long-form articles, category hubs and the legal pages an affiliate programme actually audits you for. Built as static output on a custom domain with a 101-URL sitemap.

The interesting work was structural: every article opens with an answer-first block written to survive being quoted alone, because that is what gets lifted into an AI answer. There's JSON-LD throughout, an llms.txt for AI crawlers, and zero broken links across all 105 pages.

Email again ran end to end: Cloudflare Email Routing with SPF and DMARC, plus address obfuscation on the contact page so scrapers get an encoded payload and humans get the address.

Pages
105, zero broken links
Load time
0.12–0.16s
Words
~72,000
105 pagesAnswer-first blocks JSON-LDllms.txt Sitemap 101 URLsEmail routing
Honest status: the build is complete and live, but the affiliate programme it was aimed at has a qualifying-sales deadline the project hasn't met yet. It's parked, not finished. A portfolio that only shows wins isn't a portfolio, it's an advert.

How I build

Three rules, and they're all unglamorous

Anyone can generate a good-looking page now. The difference shows up in the month after launch.

01

One source of truth

Prices, policies and copy live in one data file. The site is generated from it. Change a price once and it updates the page, the structured data, the AI crawler file and the FAQ — because the alternative is a site that quietly contradicts itself in four places.

02

The build refuses to ship bugs

Every project has guards that fail the deploy on the specific mistakes that already happened once: a leaked address, a zero price, a contrast ratio under 4.5:1, a form embed that would render blank, a stale cache reference. Regressions get caught by the machine, not by luck.

03

Verify, don't assume

Claims get tested against the live URL in a real browser. I've reported my own work as broken mid-session more than once because a first check was wrong. Measuring beats believing, and it beats it every single time.

Receipts

Bugs that shipped looking fine

Every one of these passed a visual check. This is the 30% that separates a demo from a delivered project — and the reason "the AI built it in an afternoon" is only ever half the story.

01

A regex ate every dollar sign and the digit after it. $180 rendered as 80. The deposit rendered as 0. Sitewide, and it looked completely normal.

02

The main call-to-action failed accessibility at 1.88:1. White on soft rose. WCAG AA needs 4.5:1. Fixed by measuring the actual pixels rather than trusting my eye.

03

The intake form rendered as an empty box. The embed used a lazy-load attribute with no script to activate it. Anyone sent that link saw nothing at all.

04

Source files were publicly downloadable. The price data and build script were being served at the live domain. A redirect fix wasn't enough — stale edge cache still leaked the real file on 3 of 20 requests.

05

A hand-maintained AI-crawler file promised a service the client doesn't offer. It still advertised a free blow-dry after the client removed it. Now generated from the same source as the page.

06

A 24-hour stylesheet cache served phones a design with no layout rules. Fixing the cache header didn't help — entries already cached don't get evicted. Solved by hashing the file contents into its own URL.

Available now

Got something that needs to actually work?

Websites, email infrastructure, and the growth systems around them. I take a small number of projects at a time and I'd rather tell you what's hard about yours than quote you a number on day one.

hello@verysketchy.lol