Gerris home
Gerris

Chris Abraham: technical consulting, AI tools, and technical SEO

Home › Guides › Lynx for Website QA

Lynx for website QA: text browser checks before every launch

Lynx has been around since the early nineties, and it's still one of the most useful tools in my launch kit. Because it ignores styling and never runs JavaScript, it strips a page down to what the server actually sends. Scripted from the command line, it can check every page of a site in minutes, which makes it a natural fit for redesigns, migrations, and release checklists.

Getting Lynx

I run Lynx on a Linux server over SSH, from an old ThinkPad, and that's the simplest setup. On Debian or Ubuntu:

sudo apt update && sudo apt install lynx

Other systems: brew install lynx on macOS with Homebrew, sudo dnf install lynx on Fedora, and on Windows, the same apt command inside the Windows Subsystem for Linux. Once it's installed, lynx --version confirms it works.

Commands worth memorizing

CommandWhat it gives you
lynx URLAn interactive text browser. Arrows move, Enter follows a link, q quits, and \ toggles the HTML source.
lynx -dump URLThe rendered text, followed by a numbered list of every link.
lynx -dump -nolist URLText only, no link list. Best for comparing two versions of a page.
lynx -dump -listonly URLOnly the links, numbered, with their full addresses.
lynx -source URLThe raw HTML, handy for checking head tags.

Five checks I script before a launch

1. Every page in the sitemap has real text

Pull the URLs from the sitemap and count the words Lynx sees on each. A product page that comes back with forty words when it should have four hundred is a template hiding its content behind scripts.

curl -s https://example.com/sitemap.xml | grep -o '<loc>[^<]*' | sed 's/<loc>//' |
while read u; do echo "$(lynx -dump -nolist "$u" | wc -w) $u"; done | sort -n | head

The thinnest pages float to the top of the list.

2. Staging and production say the same thing

After a migration, compare the old page with the new one as text. Missing paragraphs, dropped FAQs, and lost disclaimers show up immediately, without any styling noise.

diff <(lynx -dump -nolist https://old.example.com/pricing/) \
     <(lynx -dump -nolist https://www.example.com/pricing/)

3. No stray noindex survived from staging

The most expensive launch mistake I know is a robots noindex tag carried over from a staging site. One loop over the sitemap catches it:

... | while read u; do lynx -source "$u" | grep -qi 'noindex' && echo "NOINDEX $u"; done

4. Links are real, and they all resolve

The link list shows only genuine anchor links, so navigation built from click handlers simply won't appear. Feed the list to curl to catch broken targets and redirect chains:

lynx -dump -listonly https://example.com/ | awk '/https?:/{print $2}' | sort -u |
xargs -n1 curl -s -o /dev/null -w '%{http_code} %{url_effective}\n' | grep -v '^200'

5. The first screen is about the page

Read the top twenty lines of each key template's dump. If a consent banner, a mega menu, and a promotional strip come before the first heading, assistive technology and crawlers wade through all of it too. Reordering the markup, or adding a skip link, fixes the problem for both.

Reading the results with a team

Text dumps are easy to share, and they make strong evidence in a developer ticket: here's the page as a crawler receives it, and here's the paragraph that's missing. Nobody has to install anything to read a text file, and the comparison is hard to argue with.

When a terminal isn't an option

Plenty of teams can't or won't install command-line tools. These get most of the way there:

Here's the short version: if a page works in Lynx, you're way more than halfway there.

Add it to the checklist

I add a Lynx pass to every launch: sitemap word counts, a noindex sweep, a link check, and a text diff of the most important templates. It takes about ten minutes and catches problems a styled browser hides. For the full launch sequence, see the website migration SEO checklist, and for the deeper rendering questions, how to tell if JavaScript is hiding your content.

References