Everything our analysis can say — 80 findings, each with how serious it is and roughly how much work the fix is. We publish it because an auditor's ruler should be visible. If we claim something about your site, it has to be on this list.
like this — values filled in per site
| Code | What it means | Severity | Work |
|---|---|---|---|
contrast.few | Contrast is below standard in count places (e.g. ratio:1, needs need:1) | low | hours |
contrast.some | count of checked texts are too light — unreadable for low vision (worst worst:1) | medium | hours |
contrast.most | Most text (count of checked) fails the contrast standard — worst worst:1, needs 4.5:1 | high | hours |
layout.overflow | The page is wider than the screen — pxpx of sideways scroll (culprit <el>) | medium | hours |
layout.overflow.mobile | The page is wider than the screen — pxpx of sideways scroll (culprit <el>). On a phone this reads as a broken page. | medium | hours |
tap.most-small | count of checked buttons/links are under 44px — hard to hit on a phone | medium | hours |
tap.some-small | count buttons/links are under 44px | low | hours |
perf.lcp.slow | Largest content paints at ms s — Google counts that as slow, and some people leave sooner | high | a day |
perf.lcp.mediocre | Largest content paints at ms s (Google's threshold is budgetMs s) | medium | a day |
perf.cls.high | The page jumps while loading (CLS cls) — people click the wrong thing | medium | a day |
perf.cls.some | Slight movement while loading (CLS cls) | low | a day |
perf.weight.heavy | The page weighs bytes MB — slow to open on mobile data | high | a day |
perf.weight.high | The page weighs bytes MB | medium | a day |
perf.images.oversized | count images are sent far larger than they display (e.g. naturalWpx where shownWpx is needed) — the fastest way to speed the page up | medium | hours |
perf.ttfb.slow | The server responds slowly (ms ms) | medium | a day |
text.body-small | Body text is pxpx — tiny on a phone | medium | hours |
text.line-height-tight | Line spacing is tight — longer text is hard to read | low | hours |
| Code | What it means | Severity | Work |
|---|---|---|---|
sec.no-https | The site does not use HTTPS — the browser shows "not secure" | high | hours |
sec.no-hsts | No HSTS — a browser can be redirected to the unencrypted version | medium | minutes |
sec.framable | The page can be embedded in someone else's frame (clickjacking) | low | minutes |
seo.no-lang | The page declares no language — Google has to guess | medium | minutes |
seo.title.short | The page title is too short (len characters; Google shows ~60) | low | minutes |
seo.title.long | The page title is too long (len characters; Google shows ~60) | low | minutes |
seo.title.missing | The page has no title — Google shows the URL instead | high | minutes |
seo.desc.length | The description under the Google result is the wrong length | low | minutes |
seo.desc.missing | No description — Google picks what to show under your name | medium | minutes |
seo.no-viewport | The page is not adapted for phones | high | hours |
seo.no-canonical | No canonical — duplicate URLs split your Google weight | low | minutes |
seo.no-og | Sharing the link on WhatsApp/Facebook shows no image or description | low | minutes |
seo.h1.missing | The page has no main heading (H1) | medium | hours |
seo.h1.multiple | Multiple H1s (count) — Google cannot tell what the page is about | low | hours |
seo.thin-content | Very little text on the page — Google has nothing to find it by | medium | a day |
seo.img-alt.missing | Images have no descriptions (withAlt/total) — Google cannot see them | medium | hours |
perf.html-heavy | The homepage is heavy — slow on a phone with a weak connection | medium | a day |
perf.blocking-scripts | count scripts delay the page from appearing | medium | hours |
perf.images.eager | Every image loads at once — the page opens slower than it needs to | low | hours |
ai.no-structured-data | No structured data — ChatGPT/Google do not "see" you as a company | medium | hours |
ai.no-sitemap | No sitemap — Google finds your pages more slowly | low | minutes |
ai.robots-blocks-ai | robots.txt blocks AI assistants — they will not recommend you | medium | minutes |
| Code | What it means | Severity | Work |
|---|---|---|---|
design.font.none | No typeface of your own — the page looks like a default | low | hours |
design.font.too-many | count different typefaces — the page looks scattered | medium | hours |
design.font-sizes.many | Too many different text sizes | low | hours |
design.no-sections | The page is not divided into sections — hard to scan | low | a day |
design.no-nav | No navigation bar — a visitor cannot tell where to go next | medium | a day |
design.no-images | Not a single image on the homepage | low | a day |
design.img.no-srcset | Images are not sized to the screen — phones download the full versions | low | hours |
design.img.no-dimensions | Images have no dimensions — the page jumps while loading | low | hours |
design.img.old-format | Images are in an old format — the page is heavier and slower than it needs to be | medium | hours |
design.no-viewport | On a phone the page shows as a shrunken desktop version | high | hours |
design.fixed-widths | Hard-coded widths — some content does not fit on a phone | low | hours |
| Code | What it means | Severity | Work |
|---|---|---|---|
a11y.no-lang | The page declares no language — a screen reader will pronounce it wrong | high | minutes |
a11y.h1.missing | The page has no H1 — it is not clear what it is about | medium | hours |
a11y.h1.multiple | The page has count H1 headings — the structure is unclear | low | hours |
a11y.heading-jump | Heading levels skip (e.g. H2 → H4) — navigating by headings breaks | low | hours |
a11y.no-main | No <main> region — nowhere to "skip to content" | low | minutes |
a11y.img-alt.few | missing of total images have no description | low | hours |
a11y.img-alt.many | missing of total images have no description — for a blind user they simply do not exist | high | hours |
a11y.form.unlabelled | inputs input fields but only named names — a screen reader cannot say what to type | high | hours |
a11y.no-zoom | The page blocks zooming — text stays small for anyone with weak eyesight | high | minutes |
a11y.vague-links | count links with no meaning ("here", "more") — a list of links becomes unreadable | low | hours |
| Code | What it means | Severity | Work |
|---|---|---|---|
legal.no-regnr | The page does not show a idName — imprint | high | minutes |
legal.no-contact | Neither e-mail nor phone — a customer cannot reach you, and it is a legal gap too | high | minutes |
legal.no-address | No registered address shown | medium | minutes |
legal.name-mismatch | The page calls itself "pageName", the register says "registerName" — if that is a brand, the legal name belongs beside it | medium | hours |
legal.register-status-inactive | The register says the company status is "status", yet the site keeps offering services | high | a day |
legal.vat-missing-on-page | The register lists a VAT payer, but the page shows no VAT number | low | minutes |
legal.register-not-checked | No comparison against register was made — why | low | minutes |
legal.no-privacy-policy | No privacy policy — GDPR requires one for any site that collects data | high | hours |
legal.no-terms | No terms of use | low | hours |
legal.no-cookie-policy | The page runs tracking tools but has no cookie policy | high | hours |
| Code | What it means | Severity | Work |
|---|---|---|---|
consent.reject-ignored | We pressed “button” and tracking cookies were set anyway (cookies). A consent choice that changes nothing when refused is not consent in law | high | a day |
consent.reject-not-offered | The banner lets a visitor agree but not refuse — there is no reject control. Declining must be as easy as accepting | high | hours |
consent.reject-buried | The accept button is ratio× larger than the refuse option — equal prominence is a requirement, not a style choice | medium | hours |
consent.prechecked | count consent checkboxes are pre-ticked. A pre-ticked box is not consent (GDPR Art. 4(11)) | high | minutes |
consent.cookie-wall | The page cannot be read without agreeing first — consent must be freely given, and “agree or leave” is not | medium | a day |
consent.reject-honoured | We pressed “button” — and not one tracking cookie was set. That is correct, and most sites fail it | low | minutes |
| Code | What it means | Severity | Work |
|---|---|---|---|
identity.freemail | Contacts list a free e-mail (email) — for a company with its own domain that looks temporary | medium | hours |
identity.foreign-domain.kin | The site is site, but the e-mail is at domain (email). To you it is obviously the same company — to a visitor it is not. Either move the address to site, or say on the page that domain is also you | low | hours |
identity.foreign-domain | The site is site, but the e-mail is on a completely different domain: email. Someone about to pay stops right here — some assume the site is compromised | medium | hours |
identity.phone-formats | The same phone number is written in several formats — one consistent form reads as tidier | low | minutes |