The audit I run on other people
I measure contractors’ websites for a living. So here is mine.
This is the same audit I send out unsolicited, run on my own site, published whether it flatters me or not.
Some of it was found while building this. The rest was found after the site was already live, which means it was live and broken while I was telling other people to check theirs. The numbers are measured, not estimated. The second half is the part that matters: the faults I have not fixed, and why.
Found and fixed
14 things that were wrong with this site
In the order they would have cost me a client.
Every link in my own menu landed you in the wrong place, on a phone
FixedA rule hiding the desktop phone button on small screens lost a specificity contest to a rule further down the file that makes phone links tappable. One is worth 0,1,0, the other 0,1,1. The higher number wins, so the button I thought was hidden was on every phone, and my header was 166px tall.
On top of that, nothing on the page told the browser to leave room for that header when it jumped to a section. So tapping Prices scrolled you to a spot where the heading was completely underneath the header. Every menu item did it. Every button did it.
This is on a site that says I open your website on a real phone and measure what it does. I had not tapped my own menu on a phone.
Fixed: the header is 121px now, and every section leaves room for it. The three demonstration sites had the same fault and got the same fix.
The price section pushed the whole page wider than the phone
FixedThe badge on the middle price reads “The one I’d build for you” and was set never to wrap. That is 268px of unbreakable text sitting beside a heading, which forced the card to 372px inside a 331px column, which pushed the page to 394px on a 375px screen.
Result: the whole site slid sideways under your thumb, worst of all on the section where you decide whether to spend money.
Fixed: the badge wraps, and the page now physically cannot grow wider than the screen.
I published three numbers about my own speed, measured three different ways
FixedThe tile said this page weighed 48 KB. That was the size of the file on disk. My host compresses everything before sending it, so what actually reaches you is 13 KB, which is what the live measurement underneath was showing. The demonstration cards quoted file sizes too.
So my own site claimed to be heavier than the demos I built to show off, on three numbers measured on two different bases, directly under the words “measured in your browser, just now.”
Fixed: every number now reports what actually crosses the wire, and the build recalculates them so they cannot go stale again.
My robots file was quietly cancelling the instruction not to index the demos
FixedI had blocked search engines from fetching the three demonstration pages, believing that kept them out of results. It does the opposite. A blocked crawler never reads the “do not index this” instruction inside the page, and Google will still list a blocked address using nothing but the words other pages link to it with. My homepage links to all three by company name.
That would have put three invented Milton companies into search results, on the same site where I accuse other people of doing precisely that.
Fixed: the block is gone, so the instruction can be read and obeyed. The weaker control was cancelling the stronger one.
Six smaller ones, in the same sweep
FixedThe animated counters on the metric tiles could read the placeholder number instead of the measured one and then spend half a second writing it back, under the words “measured just now.” Deleted. A measurement should settle on a reading, not roll up like a fruit machine.
Two em dashes were still reaching visitors from inside the code, one of them on the second visit, which is the exact visit this site is built to earn.
The colour I gave your phone for the bar at the top of the screen was near black, above a cream page, and appears nowhere in the design.
My own email address was painted in the same colours as the error box, so the only way to reach me by writing looked like something had gone wrong.
The step numbers in the dark band sat at 4.05 against a requirement of 4.5, and the “still wrong” badge on this very page sat at 2.72 for anyone whose phone is set to dark, which after sunset is most people. Both fixed.
And the labels throughout were as small as 9px, on demonstration sites, in a typeface I chose specifically because it was designed to be readable by people with poor eyesight. Nothing is below 11.5px now.
The contact form threw every enquiry away
FixedIt had no action, no method, and no name attribute on a single field. On submit it hid itself and printed “Thanks, I’ve got it.” Nothing was sent anywhere. Anybody who filled it in would have been told I had their details, and then never heard from me again.
Two sections further down, the same site tells contractors to test their own contact form on the first of every month.
Fixed: it posts properly now, the success message only appears on a real confirmation from the server, and if the send fails it shows my phone number instead of pretending.
The portfolio links went to a page that was not the portfolio
FixedAll three “open them on your phone and time them yourself” links pointed at a host that returned an identical 14,716 byte shell for every one of them, titled Claude Artifact. The demonstration sites themselves never loaded.
That failed in front of exactly the person I most wanted to impress: the one who took me up on the invitation.
Fixed: all three now sit on this domain under /work/, with real titles, and deliberately hidden from search.
The page took 1,511 milliseconds, and 1,242 of them were somebody else’s
FixedThe HTML itself downloaded in 5ms. Everything else was a blocking stylesheet request to Google Fonts.
On a slow connection a visitor could have seen a load time above my own guarantee, printed in my own hero, directly under a headline criticising slow websites.
Fixed: the font declarations are written into the page instead of fetched. 1,511ms to 33ms.
Lists broke into narrow vertical columns
FixedThe list items were laid out as a two column grid. Any item containing a bold lead-in plus ordinary text is three things in a two column grid, so the trailing text dropped to a second row and got crushed into the narrow column.
It looked like a rendering fault on several of the price bullets, which is a poor advertisement on a page selling web design.
Fixed: the bullet is positioned absolutely and the text flows normally. 27 list items checked, none broken.
Dark mode failed contrast at 2.01
FixedThe recommended-tier badge and the mobile call button used white text on an accent colour. In dark mode that accent inverts to a light tone, so the white text sat at a contrast ratio of 2.01 against it. The minimum is 4.5.
Fixed: both now sit at 8.81. Every element on the site clears the threshold in both themes; the lowest is 4.55.
The prices disagreed with themselves across three documents
FixedNine separate contradictions between the site, the price sheet and the proposal template. Build tiers, care plans, hourly rate, deposit split, discount percentage.
Fixed: one canonical set, and the price sheet and the proposal are now generated from the same numbers.
The share image was saved as share.jpg.jpg
FixedWindows hides known file extensions, so typing “share.jpg” produced share.jpg.jpg. The tag pointed at a file that did not exist. Every time this link was shared it would have rendered as an empty grey box.
Fixed: renamed, and verified live at 1200 × 630, 51 KB.
The site was invisible to everyone for the first hour
FixedManually deployed sites on this host start private. The site returned HTTP 401 Unauthorized to the entire internet while appearing to work perfectly when I looked at it.
It was only caught by requesting the page from outside rather than trusting the browser tab that was already open.
A script I wrote to tidy punctuation broke a font
FixedIt collapsed repeated characters, which turned a font’s optical size range 6..72 into 6.72 and quietly broke the URL. One demonstration site fell back to system fonts.
Four checks passed cleanly before this was found. The fifth compared the file sizes printed on the portfolio cards against the actual files, and a four kilobyte gap gave it away.
Found and not fixed
5 things still wrong with it
Publishing this is the whole point of the page. Anything I hide here, you would find anyway.
There is no photograph of me
Still wrongA site selling a one-man service with no picture of the one man is weaker than it should be. I have not taken one yet. The slot is built and waiting.
There are no testimonials, because there are no clients
Still wrongI could write something warm and unattributed. Every website you have ever mistrusted did exactly that. This section stays empty until somebody real fills it.
The fonts still come from a third party
Still wrongTwo requests leave this page for Google’s font servers. Self-hosting them would remove the dependency and about 90 KB. It is a few hours of work and it has not happened yet.
The page is longer than it should be
Still wrongAbout 14 phone screens. I have criticised contractor sites for exactly this. Mine has a reason for every section, which is what everybody says about their own long page.
There is a hosting badge in the corner
Still wrongThe free tier injects it after the closing tag, so it cannot be edited out. Removing it means paying for hosting or moving host. I have not decided it is worth either yet, and I would rather say so than have you spot it.
The method
What I actually measure
The same list, whether it is my site or yours.
- Can it be tapped
- Every phone number and email address, on a real handset. Not a desktop browser made narrow.
- Does the form work
- A real submission, sent from a phone that is not mine, and confirmed arriving.
- How long, and why
- Time to first byte, page weight, and which single resource is responsible for the delay.
- What Google thinks your town is
- Page titles, headings, image filenames and footer links. They frequently disagree with each other.
- Where your proof is
- Reviews, awards, credentials, and whether a visitor to the homepage ever sees any of it.
- Who is above you
- What is ranking for your trade in your town, and whether those companies are real.
- Contrast and tap targets
- Measured ratios in both light and dark, and every target checked against the 44 pixel minimum.
- What breaks with nothing
- How the page behaves with scripts off, animation off, and a cold cache.
I will do this for your site, free
Send me your web address and you get the same thing: a short video and a written list, yours to keep and hand to whoever manages your site, whether we ever speak again or not.
Send me your web addressAudited 26 August 2026. Re-run whenever the site changes.