Link text checker

Screen reader users often pull up a list of every link on the page, stripped of the sentence around it. If forty of those links say "click here," that list is useless. Paste your HTML below and this tool pulls out every <a href> and flags the ones that fail on text alone.

Free · No signup · No limit — this one runs entirely in your browser, nothing is uploaded

Paste HTML to check

Why link text has to stand on its own

Sighted users skim a page and use position, surrounding sentences and visual styling to work out where a link goes. Screen reader users have a faster option: most screen readers can pull up a list of every link on the page in one shortcut, entirely separate from the paragraphs they sit in. That list shows nothing but the link text and, if they check, the destination.

If that text reads "click here," "read more," "learn more," or just a bare web address repeated a dozen times, the list tells the listener nothing about which link goes where. They're left opening each one to find out, or giving up. This is exactly what WCAG 2.4.4 Link Purpose (In Context) exists to prevent: the purpose of a link should be identifiable from its text, or from its text plus the context a screen reader also exposes (like the enclosing sentence or list item).

Four failure modes are mechanical enough for a script to catch, and that's what this tool checks:

  • No accessible name at all — an empty link, or an icon link with nothing announced to a screen reader.
  • Generic phrases — "click here," "read more," "learn more," "here," "this," "more," "link," "download," "continue" used as the entire link text.
  • Bare URLs as link text — a screen reader reading out "h-t-t-p-s-colon-slash-slash-example-dot-com-slash..." character by character helps no one.
  • The same text, different destinations — five "Download" links pointing to five different PDFs is indistinguishable in a links list, even though each one goes somewhere different.

What this tool catches

  • Links with no text and no aria-label
  • Text that's one of nine known generic phrases
  • Link text that's just a raw URL
  • Identical text pointing at different href values

All four are mechanical: read the text, compare it against a rule. No judgment involved.

What still needs a person, or our deep audit

  • Whether "Q3 sales report" is specific enough, or needs a product name
  • Whether the surrounding sentence already gives the link enough context
  • Links injected by JavaScript after the page loads
  • Whether an icon-only link's aria-label actually matches what it does

"Descriptive enough" is a judgment call, not a pattern match. Our deep audit reads each link with the surrounding page and tells you where it falls short.

What this checker doesn't do

It reads the HTML you paste; it doesn't render JavaScript, so links added to the page after load won't show up. Try WAVE or axe DevTools if you need the live, rendered DOM — both are free browser extensions and both are good at this.

It compares destinations as literal href strings, so /pricing and /pricing/ show up as "different" even if your server treats them the same.

More importantly, the WCAG AA requirement is Link Purpose (In Context) — link text can be judged together with the sentence, list item, table cell or paragraph it sits in. So "Read more" inside a sentence that names the destination can satisfy AA even though this tool flags it. Treat generic-phrase results as "look at this", not as a confirmed failure. Empty links with no accessible name at all are the unambiguous ones.

Questions

Why isn't "descriptive enough" one of the checks?

Because it's a judgment call, not a pattern. "Our returns policy" is a fine link on its own; "policy" pointing to the same page probably isn't — but a script can't know that without reading the sentence around it and understanding what the destination actually contains. This tool catches the nine phrases and structural problems that are unambiguous. Whether a link that passes all four checks is actually clear is what our deep AI audit is built to judge, page by page.

Where do I get the HTML to paste in?

In most browsers, right-click anywhere on the page and choose "View page source," or press Ctrl+U (Cmd+Option+U on Mac). Select all, copy, and paste it into the box above. That gives you the HTML your server sent — the same thing a screen reader sees before any JavaScript runs.

Do you store or send my HTML anywhere?

No. Everything runs in your browser with a built-in HTML parser (DOMParser). Nothing you paste is sent to a server, logged, or saved — there's no network request involved at all, which is also why this tool has no daily limit.

What counts as a "generic phrase"?

Link text that, on its own, could describe almost any link on the web: "click here," "read more," "learn more," "here," "this," "more," "link," "download," and "continue." The check is exact — after trimming whitespace and punctuation — so "Download the 2026 report" is fine; "Download" on its own is flagged.

Why does "same text, different destinations" matter if each link makes sense in its own paragraph?

Because a links list strips that paragraph away. If "Download" appears five times pointing at five different files, a sighted user scanning the page can see which download sits next to which file. Someone using a links list sees "Download," "Download," "Download" and has no way to tell them apart without opening each one.

An icon-only link with a good aria-label got flagged. Is that a bug?

It shouldn't be — this tool checks aria-label first, then visible text, then an alt attribute on an image inside the link, before deciding a link has no name. If a link genuinely has a non-empty aria-label and still gets flagged, that's worth reporting, but check first that the label isn't empty (aria-label="") or whitespace-only — both count as no name, correctly.

Link text is one check of many

The free scan also checks alt text, form labels, headings, page language and zoom settings — 16 rule-based checks across up to three pages.

Scan my site — free