Typography audit: 19 sites, 321 pages
Private deliverable. Enter the hub password to continue.
That's not right. Try again.
Typography audit: 19 sites, 321 pages
Fourteen pages out of 321 pass both rules, and eleven of those were changed an hour before the audit ran.
Measured 2026-08-01 against the two standards you set: 65 to 75 characters per line, and body type at least 20px.
The headline
| Pages | Share | |
|---|---|---|
| Measured | 321 | |
| Pass the line-length rule | 94 | 29% |
| Pass the 20px rule | 22 | 7% |
| Pass both | 14 | 4% |
Eleven of those fourteen are Verity Agentic article pages, changed an hour before this ran. The other three are hub pages. Every other page on every other site fails at least one rule, and most fail both.
34 pages run over 90 characters a line. That is roughly a third past the readable maximum. 34 pages set body text under 16px.
Three properties could not be measured (33 pages): the CRM app screen, a gated audit page, and the menopause practice site, which had no prose the script could sample.
By site, worst first
| Site | Pages | Line length OK | 20px OK | Median |
|---|---|---|---|---|
| CureCanineDisease | 8 | 0/8 | 0/8 | 104 cpl / 18.7px |
| OutdoorBoulder | 45 | 0/45 | 0/45 | 85 cpl / 17px |
| ProteinFirstRecipes | 5 | 0/5 | 0/5 | 78 cpl / 15.7px |
| SponsorLab | 8 | 0/8 | 0/8 | 92 cpl / 15.7px |
| TrainerBooked | 32 | 0/32 | 0/32 | 87 cpl / 16.0px |
| BobExecCounseling | 32 | 4/32 | 0/32 | 79 cpl / 16.0px |
| TasteBoulder | 15 | 2/15 | 0/15 | 81 cpl / 17px |
| SEOBeliever | 13 | 2/13 | 0/13 | 121 cpl / 17px |
| SmartStrongAlive | 5 | 1/5 | 0/5 | 69 cpl / 15.7px |
| BoulderThingsToDo | 14 | 3/14 | 0/14 | 78 cpl / 17.0px |
| NewToBoulder | 14 | 3/14 | 0/14 | 82 cpl / 17.0px |
| MensGroups | 16 | 4/16 | 0/16 | 78 cpl / 18.0px |
| RecipeMemoir | 7 | 2/7 | 0/7 | 73 cpl / 16.0px |
| NotTooOldForAI | 6 | 2/6 | 0/6 | 63 cpl / 19.0px |
| Vitalency | 8 | 3/8 | 0/8 | 64 cpl / 19.0px |
| MedSpasBoulder | 49 | 41/49 | 0/49 | 70 cpl / 17px |
| testosteroneinwomen | 13 | 11/13 | 0/13 | 66 cpl / 17.4px |
| VerityAgentic | 21 | 13/21 | 12/21 | 70 cpl / 20px |
| AnnetteThompson | 10 | 3/10 | 10/10 | 78 cpl / 20.4px |
Two encouraging rows. MedSpasBoulder gets line length right on 41 of 49 pages, and testosteroneinwomen on 11 of 13. Both fail only on size, which is the easier of the two to fix.
The ten worst pages for line length
| Page | Chars/line | Size |
|---|---|---|
| seobeliever.com/locations/longmont | 137 | 17px |
| curecaninedisease.com/distemper-en | 134 | 17px |
| seobeliever.com/locations/louisville | 132 | 17px |
| seobeliever.com/locations/broomfield | 131 | 17px |
| seobeliever.com/locations/lafayette | 130 | 17px |
| seobeliever.com/about | 127 | 17px |
| seobeliever.com/locations/denver | 127 | 17px |
| curecaninedisease.com/parvo-en | 125 | 17px |
| seobeliever.com/locations/boulder | 121 | 17px |
| seobeliever.com/seo-audit | 120 | 17px |
Every SEO Believer location page sits in this band, and they are entry points from search. At 137 characters the eye loses the start of the next line on the return sweep, which is the specific thing an over-long measure breaks.
There is an awkward angle worth naming: SEO Believer sells search and content expertise, and its own location pages are the least readable thing you own.
The smallest type, one page per site
| Page | Size | Chars/line |
|---|---|---|
| bobmanthy.com/videos/ | 14.4px | 61 |
| recipememoir.com/site/browse.html | 14.4px | 62 |
| tasteboulder.com/restaurants/ | 14.4px | 73 |
| medspasboulder.com/provider/absolute-beauty-solutions/ | 14.7px | 64 |
| smartstrongalive.com/protein-calculator | 14.7px | 96 |
| testosteroneinwomen.com/articles/ | 15.0px | 41 |
What is causing it
Two independent faults. Most sites have both.
No reading-width cap on the prose container. A paragraph inside a 900 to 1,100px container fills it. That is why the worst offenders are content pages on wide layouts. Capping the prose column is close to a one-line change per template.
A base font size of 16 or 17px. Reasonable a decade ago on smaller screens. On a current display it reads small, and it compounds the first fault, because small type in a wide container is exactly how a page reaches 137 characters a line.
One trap worth naming, because it already cost time on verityagentic.ai: the CSS ch unit will not solve this. One ch is the width of the digit zero in the current font, so a 65ch cap means something different in a condensed face than a normal one. An about page capped at 64ch rendered as 467px, far narrower than intended, because that site uses Arial Narrow. Set the cap in pixels, then verify the rendered character count.
The order I would fix them in
1. Pages where someone decides whether to hire you. Verity Agentic pricing at 112 characters and 16px is the sharpest example, because it carries the decision. The SEO Believer about and location pages come next, since that is where search traffic lands.
2. Sites whose entire job is reading at length. Cure Canine Disease at 104, Boulder Things To Do guides at 117, Taste Boulder at 14.4px.
3. The two near-misses. MedSpasBoulder and testosteroneinwomen already have line length right almost everywhere. Bumping the base size alone moves them close to fully compliant, which is a large win for a small change.
4. Everything else, template by template. These 19 sites share a handful of layouts, so the real work is far smaller than 321 pages implies.
I would not change 19 sites in one pass. Each needs its rendered result re-checked afterward, since neither number can be read off a stylesheet.
Re-running it
py -3.13 C:\Users\annet\ClaudeProjects\MyExecAssistant\scripts\audit_typography.py
Add --site SEOBeliever for one site, --limit 3 for a quick pass, or --json out.json for per-page detail. It takes its target list from each project's validator config, so anything the validator already covers is covered here.
How it measures. For every substantial paragraph: lines are the rendered height divided by the line height, and characters per line is the text length divided by lines. The median is taken across all paragraphs on a page, so one pull quote cannot skew the result. Headless Chromium at 1440px wide. It has to be measured on the rendered page, because glyph widths differ per font and neither figure is readable from the CSS.
Published to Annette's hub. Rebuilt from the source markdown, so edit the source and rerun rather than editing this page.