Site Punchlist

This is a sample, produced by the real thing

It was generated by the same crawler, the same rules and the same renderer that produce a paid report — nothing here is mocked up. The site it tested is Harbourline, a small shop we built specifically to be broken. Every defect listed below was planted on purpose, and you can open any page and view source to check the finding yourself.

We do not publish reports about anyone else's website.

Accessibility findings · Tue, 25 Aug 2026 12:00:06 GMT

sitepunchlist.com

https://sitepunchlist.com/demo

320defects found
10distinct problems to fix
307critical or serious
13pages tested

Download PDF Download CSV

What was tested

13pages tested
13pages found
13pages with at least one defect
8success criteria flagged here

Tested Tue, 25 Aug 2026 12:00:06 GMT using axe-core 4.13.0, rule set WCAG 2.2 Level A and AA. Pages were discovered from the site’s sitemap and its links.

Start here

These defects sit in shared templates, so each one is a single change that clears many pages at once.

Highest-reach defects
Fix Severity Pages cleared Who
Buttons with no readable text Critical 8 Developer
Dropdowns with no label Critical 7 Developer
Text is too faint against its background Serious 13 Designer
Links with no readable text Serious 13 Developer
Tap targets are too small or too close together Serious 13 Designer

Who fixes what

Defects by who fixes them
QueueDefectsShareWhat it means
Developer 133 42% A code change in a template or component
Content editor 16 5% Fixable in the CMS, no deploy needed
Designer 171 53% Needs a decision on colour, size or spacing first

Every problem, in order

Ordered by severity first, then by how many pages each one affects. 10 problems, 320 instances.

1. Buttons with no readable text

Critical

49 instances 13 of 13 pages Developer WCAG 4.1.2 Name, Role, Value (A)

Announced as "button" with nothing else. Close buttons, hamburger menus and icon toolbars are where this almost always shows up.

How to fix it. Add visible text, or aria-label when the control really is icon-only. Make sure any icon inside is marked aria-hidden="true" so it is not announced alongside.

Instead of

<button><span class="icon-close"></span></button>

Do this

<button aria-label="Close dialog">
  <span class="icon-close" aria-hidden="true"></span>
</button>

One fix, 8 pages

The same element fails in the same place on 8 of the pages tested, which means it lives in a shared template or component. Changing it once clears all of them.
.icon-btn:nth-child(n)

Show the failing elements (4 of 49)
Failing elements for Buttons with no readable text
SelectorMarkup
.icon-btn:nth-child(1) <button class="icon-btn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm9 16l-4.5-4.5" fill="none" stroke="currentColor" stroke-width="2"></path></svg></button>
.icon-btn:nth-child(2) <button class="icon-btn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm-7 8a7 7 0 0 1 14 0" fill="none" stroke="currentColor" stroke-width="2"></path></svg></button>
.utility > .icon-btn:nth-child(3) <button class="icon-btn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 4h2l2.6 11h9.8l2.1-8H6.4M9 20a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm8 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z" fill="none" stroke="currentColor" stroke-width="2"></path></svg></button>
article:nth-child(1) > .body > .icon-btn <button class="icon-btn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 21s-7-4.6-7-9.5A3.5 3.5 0 0 1 12 8a3.5 3.5 0 0 1 7 3.5C19 16.4 12 21 12 21z" fill="none" stroke="currentColor" stroke-width="2"></path></svg></button>

Pages affected

Engine rule button-name. Rule documentation.

2. Images with no alt attribute

Critical

16 instances 8 of 13 pages Content editor WCAG 1.1.1 Non-text Content (A)

Without alt text a screen reader falls back to reading the filename, so a product photo becomes "I M G underscore 4 7 2 1 dot j p g". It also means nothing sensible shows when the image fails to load.

How to fix it. Describe what the image conveys in this context, not what it literally depicts. If it is purely decorative, use alt="" (empty, not missing) so it is skipped cleanly.

Automated testing can only see whether alt exists. Whether the wording is any good still needs a person.

Instead of

<img src="/img/IMG_4721.jpg">

Do this

<img src="/img/IMG_4721.jpg" alt="Oak dining table seating six">
<img src="/img/divider.svg" alt="">  <!-- decorative -->
Show the failing elements (4 of 16)
Failing elements for Images with no alt attribute
SelectorMarkup
img[src$="harbour-mug.svg"] <img src="/demo/img/harbour-mug.svg">
img[src$="linen-apron.svg"] <img src="/demo/img/linen-apron.svg">
img[src$="oak-board.svg"] <img src="/demo/img/oak-board.svg">
img[src$="copper-pot.svg"] <img src="/demo/img/copper-pot.svg">

Pages affected

Engine rule image-alt. Rule documentation.

3. Dropdowns with no label

Critical

7 instances 7 of 13 pages Developer WCAG 4.1.2 Name, Role, Value (A)

The dropdown is announced with only its current value, so there is nothing saying what it selects. Currency, country and sort-order pickers are frequent offenders.

How to fix it. Add a <label for>, or aria-label when there is genuinely no room for visible text.

Instead of

<select name="sort"><option>Newest</option></select>

Do this

<label for="sort">Sort by</label>
<select id="sort" name="sort"><option>Newest</option></select>

One fix, 7 pages

The same element fails in the same place on 7 of the pages tested, which means it lives in a shared template or component. Changing it once clears all of them.
select

Show the failing elements (4 of 7)
Failing elements for Dropdowns with no label
SelectorMarkup
select <select> <option>What is this about?</option> <option>An order</option> <option>Something else</option> </select>
select <select><option>Quantity: 1</option><option>Quantity: 2</option></select>
select <select><option>Quantity: 1</option><option>Quantity: 2</option></select>
select <select><option>Quantity: 1</option><option>Quantity: 2</option></select>

Pages affected

Engine rule select-name. Rule documentation.

4. Form fields with no label

Critical

1 instance 1 of 13 pages Developer WCAG 4.1.2 Name, Role, Value (A)

The field is announced with no name, so it is guesswork what to type. Placeholder text does not count: it disappears the moment someone starts typing, and many screen readers do not announce it.

How to fix it. Connect a <label> to the input with for/id, or wrap the input in the label. Keep the placeholder as a hint if you like, but it is never the label.

Instead of

<input type="email" placeholder="Email address">

Do this

<label for="email">Email address</label>
<input id="email" type="email" placeholder="you@example.com">
Show the failing elements
Failing elements for Form fields with no label
SelectorMarkup
input[type="text"]:nth-child(3) <input type="text">

Pages affected

Engine rule label. Rule documentation.

5. Text is too faint against its background

Serious

132 instances 13 of 13 pages Designer WCAG 1.4.3 Contrast (Minimum) (AA)

Anyone reading on a phone in daylight, on a cheap monitor, or with reduced contrast sensitivity loses the text entirely. This is the single most common defect on the web.

How to fix it. Darken the text or lighten the background until the ratio reaches 4.5:1 for body text, or 3:1 for text at 18pt/14pt-bold and larger. Change the colour token, not the individual element — the same pale grey is usually defined once and used everywhere.

The engine reports the exact measured ratio for each element, so you can see how far off each one is.

Instead of

<p style="color:#999; background:#fff">Read our terms</p>
<!-- 2.85:1 - fails -->

Do this

<p style="color:#595959; background:#fff">Read our terms</p>
<!-- 7.0:1 - passes -->

One fix, 13 pages

The same element fails in the same place on 13 of the pages tested, which means it lives in a shared template or component. Changing it once clears all of them.
li:nth-child(n) > a[href$="demo/"]

Show the failing elements (4 of 132)
Failing elements for Text is too faint against its background
SelectorMarkup
li:nth-child(2) > a[href$="demo/"] <a href="/demo/">Home</a>
a[href$="shop.html"] <a href="/demo/shop.html">Shop</a>
a[href$="journal.html"] <a href="/demo/journal.html">Journal</a>
a[href$="about.html"] <a href="/demo/about.html">About</a>

Pages affected

Engine rule color-contrast. Rule documentation.

7. Tap targets are too small or too close together

Serious

39 instances 13 of 13 pages Designer WCAG 2.5.8 Target Size (Minimum) (AA)

Small, tightly packed controls are easy to miss for anyone with a tremor, using a touchscreen one-handed, or on the move. Added in WCAG 2.2, so plenty of older sites have never been checked against it.

How to fix it. Make targets at least 24×24 CSS pixels, or leave enough space around them that a 24px circle centred on each does not overlap its neighbour. Padding counts toward the target — the icon itself does not have to grow.

Instead of

.social-icon { width: 16px; height: 16px; margin: 0 2px; }

Do this

.social-icon { width: 16px; height: 16px; padding: 8px; }
/* 32x32 target around a 16px icon */

One fix, 13 pages

The same element fails in the same place on 13 of the pages tested, which means it lives in a shared template or component. Changing it once clears all of them.
a[href="https://example.com/x"]

Show the failing elements (4 of 39)
Failing elements for Tap targets are too small or too close together
SelectorMarkup
a[href="https://example.com/x"] <a href="https://example.com/x"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 4l16 16M20 4L4 20" fill="none" stroke="currentColor" stroke-width="2"></path></svg></a>
a[href="https://example.com/ig"] <a href="https://example.com/ig"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M7 3h10a4 4 0 0 1 4 4v10a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4V7a4 4 0 0 1 4-4z" fill="none" stroke="currentColor" stroke-width="2"></path></svg></a>
a[href="https://example.com/fb"] <a href="https://example.com/fb"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14 8h3V4h-3a4 4 0 0 0-4 4v3H8v4h2v7h4v-7h3l1-4h-4V8z" fill="none" stroke="currentColor" stroke-width="2"></path></svg></a>
a[href="https://example.com/x"] <a href="https://example.com/x"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 4l16 16M20 4L4 20" fill="none" stroke="currentColor" stroke-width="2"></path></svg></a>

Pages affected

Engine rule target-size. Rule documentation.

8. Lists contain elements that are not list items

Serious

13 instances 13 of 13 pages Developer WCAG 1.3.1 Info and Relationships (A)

A screen reader announces "list, 6 items" so someone knows what they are stepping into. Stray wrappers inside break the count, and sometimes break the announcement entirely. Injected advert and tracking divs are a frequent cause.

How to fix it. Only <li>, <script> and <template> may sit directly inside <ul> or <ol>. Move wrappers inside the <li>.

Instead of

<ul>
  <div class="ad-slot"></div>
  <li>First</li>
</ul>

Do this

<ul>
  <li><div class="ad-slot"></div></li>
  <li>First</li>
</ul>

One fix, 12 pages

The same element fails in the same place on 12 of the pages tested, which means it lives in a shared template or component. Changing it once clears all of them.
ul

Show the failing elements (4 of 13)
Failing elements for Lists contain elements that are not list items
SelectorMarkup
ul <ul>
ul <ul>
nav > ul <ul>
ul <ul>

Pages affected

Engine rule list. Rule documentation.

9. Page does not declare its language

Serious

1 instance 1 of 13 pages Developer WCAG 3.1.1 Language of Page (A)

A screen reader picks its pronunciation rules from this attribute. Without it, English read by a voice set to French is close to unintelligible.

How to fix it. Set lang on the <html> element in your base template. One line, every page.

Instead of

<html>

Do this

<html lang="en">
Show the failing elements
Failing elements for Page does not declare its language
SelectorMarkup
html <html>

Pages affected

Engine rule html-has-lang. Rule documentation.

10. Zoom is disabled

Moderate

13 instances 13 of 13 pages Developer WCAG 1.4.4 Resize Text (AA)

user-scalable=no or a low maximum-scale stops people pinch-zooming on a phone. For anyone who enlarges text to read it, the page becomes unusable.

How to fix it. Remove user-scalable and maximum-scale from the viewport meta tag.

Instead of

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

Do this

<meta name="viewport" content="width=device-width, initial-scale=1">

One fix, 13 pages

The same element fails in the same place on 13 of the pages tested, which means it lives in a shared template or component. Changing it once clears all of them.
meta[name="viewport"]

Show the failing elements (4 of 13)
Failing elements for Zoom is disabled
SelectorMarkup
meta[name="viewport"] <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
meta[name="viewport"] <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
meta[name="viewport"] <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
meta[name="viewport"] <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

Pages affected

Engine rule meta-viewport. Rule documentation.

Pages tested

Every page tested, with its defect count
Page Defects Needs review Rules passed
Harbourline — kitchen and table
https://sitepunchlist.com/demo
41 0 13
Shop — Harbourline
https://sitepunchlist.com/demo/shop.html
49 0 13
Journal — Harbourline
https://sitepunchlist.com/demo/journal.html
19 0 13
About — Harbourline
https://sitepunchlist.com/demo/about.html
19 0 12
Contact — Harbourline
https://sitepunchlist.com/demo/contact.html
22 0 13
Harbour Mug — Harbourline
https://sitepunchlist.com/demo/product-harbour-mug.html
22 0 17
Linen Apron — Harbourline
https://sitepunchlist.com/demo/product-linen-apron.html
22 0 17
Oak Serving Board — Harbourline
https://sitepunchlist.com/demo/product-oak-board.html
22 0 17
Copper Pot — Harbourline
https://sitepunchlist.com/demo/product-copper-pot.html
22 0 17
Glass Carafe — Harbourline
https://sitepunchlist.com/demo/product-glass-carafe.html
22 0 17
Wool Throw — Harbourline
https://sitepunchlist.com/demo/product-wool-throw.html
22 0 17
Looking after an oak board — Harbourline
https://sitepunchlist.com/demo/journal-oak.html
19 0 12
Why copper pans have a tin lining — Harbourline
https://sitepunchlist.com/demo/journal-copper.html
19 0 12

The record

This report is a record of automated testing carried out on Tue, 25 Aug 2026 12:00:06 GMT against https://sitepunchlist.com, using axe-core 4.13.0 with the WCAG 2.2 Level A and AA rule set. It is not a certification, an audit opinion, or a statement of conformance.

What this does not tell you

Automated testing cannot establish WCAG conformance, and it cannot establish legal compliance. Nothing here is a certification or a legal opinion.

The rules we run reach 23 of the 55 WCAG 2.2 Level A and AA success criteria. 32 have no automated rule at all — keyboard traps, focus order, focus visibility, error identification and consistent navigation among them. Those need a person. See the full table of what we can and cannot check.

Report sample00, generated Tue, 25 Aug 2026 12:00:18 GMT by Site Punchlist. Questions: support@sitepunchlist.com.