squirrelscan
GitHub

Content audit rules: thin, duplicate and stale content

Audit rules for page text: thin and duplicate content, stale dates, placeholder text, mojibake, broken HTML, readability and keyword stuffing.

Content rules read the words a visitor actually sees. Some of them catch pipeline failures that reach the reader as text: mojibake, literal markdown, lorem ipsum, a development URL, a visible undefined. Others measure the writing itself, its length, its readability and its keyword density. A third group compares pages against each other, finding duplicate titles, thin outliers and titles that break the site’s own template.

Run only these rules

squirrel audit https://example.com --rule-include content

LLM content quality score is retired and never runs. It stays in the table so its page and ID keep working.

Where to start

These carry the highest severity and weight in the category.

Rules

RuleWhat it flagsSeverityScope
Article link density: how many links an article needsAn article that cites nothing and links nowhere is a dead end. squirrel scales the minimum with the article’s length.warningPer-page
Author attribution: schema, rel=author and visible bylinesWho wrote a page is part of how a reader decides whether to trust it. squirrel inventories the author markup a page carries.infoPer-page
Duplicate meta descriptions across pagesOne description reused across a section describes none of those pages well. squirrel groups every crawled page by its meta description.warningSite-wide
Duplicate title tags: the same title on several pagesTwo pages with the same title compete with each other in search and look identical in results. squirrel groups every crawled page by its title.warningSite-wide
Fake phone numbers and example.com emails in productionA 555-01xx phone number or an address at example.com means a theme’s contact block shipped unedited. squirrel flags template-default contact details and fails them on contact and checkout pages.warningPer-page
Flesch reading ease: measuring how hard a page is to readsquirrel computes a Flesch reading ease score and a Flesch-Kincaid grade level from the page text, and reports both without judging them.infoPer-page
Footer copyright year behind the current yearAn old year in the footer is the cheapest signal that a site is abandoned. squirrel reads the footer only, so dated body copy is left alone.warningPer-page
Freshness signals: the dates a page publishes about itselfsquirrel inventories the date signals on a page: the Last-Modified header, schema dates, time elements and Open Graph article dates.infoPer-page
Hidden text and links: what Google’s spam policy coversText a crawler reads and a visitor cannot see is a spam policy violation. squirrel finds it while exempting screen-reader and collapsed-UI patterns.warningPer-page
Inconsistent page titles: pages breaking the templateMost sites title pages the same way and then ship a pocket that does not. squirrel infers your template and reports the pages that break it.warningSite-wide
Keyword stuffing: measuring density around your CTAsRepeating a term unnaturally is a spam policy violation. squirrel measures density while discounting repeated call-to-action labels.warningPer-page
Literal bold on the page: markdown that never renderedVisible asterisks, bracket links or escaped tags mean a value printed as text instead of markup. squirrel reads the prose and names the mistake.warningPer-page
LLM content quality score: what it measuresA language-model read of the page copy, scored 0 to 100 with written feedback. Retired in this release: it never runs.infoPer-page
localhost in production: dev hosts left in the markupA link or image pointing at localhost or a preview deployment is broken for every visitor. squirrel classifies the host and says whether it is yours.warningPer-page
Lorem ipsum in production: placeholders and leftoversFiller copy, unrendered template syntax and a visible undefined all mean something shipped unfinished. squirrel names the family and shows a sample.warningPer-page
Malformed HTML: doctype, nesting and deprecated tagsBrowsers recover from bad markup silently and other parsers may not. squirrel checks document structure, nesting and deprecated elements.warningPer-page
Meta tags in the body: why they are silently ignoredA meta description or robots tag inside body is not read by anything. squirrel finds every meta element that ended up outside the head.errorPer-page
Misspellings and doubled words in English copyA typo in a heading, a price table or a page title is the first thing a visitor notices. squirrel finds known misspellings and doubled words on English pages, and names the correction.warningPer-site
Mojibake: ’ and other encoding corruption in page textStrange character sequences in your copy mean the bytes and the declared encoding disagree. squirrel finds them and names which of the two is wrong.warningPer-page
Placeholder images and camera-default alt textA placeholder service image, a 1x1 stand-in or an alt of DSC_0001 means the media was never finished. squirrel names the image and why it was flagged.warningPer-page
Skipped heading levels: h1 to h3 and other outline problemsHeadings are the page’s outline, and a skipped level breaks it for anyone navigating by structure. squirrel checks order, emptiness, length and repeats.warningPer-page
Thin against your own site: outliers by page typeA 200 word product page is normal and a 200 word article is not. squirrel compares each page against the median for its own page type.warningSite-wide
Thin content: the 300 word floor and what to do below itA page under a few hundred words rarely answers the question it ranks for. squirrel counts the words and reports against two thresholds.warningPer-page
Visible date disagrees with schema: which date is wrongA page states its date in several places and presence checks pass as soon as one exists. squirrel compares the byline, the schema and the URL year.warningPer-page
Wrong Content-Type: header and extension disagreeA stylesheet served as text/html is refused by the browser under nosniff. squirrel compares the response type against the URL extension.warningPer-page

Key terms

  • Author byline: The visible author name on an article, ideally linked to an author page and matched by an author entity in structured data.
  • Character encoding: The mapping from bytes to characters (normally UTF-8) declared in the Content-Type header or a meta charset tag; a mismatch produces mojibake.
  • Cloaking: Serving search engines or particular user agents different content from what visitors see, a Google spam policy violation.
  • Content freshness: How current a page is and how consistently it says so: visible dates, dateModified, sitemap lastmod and copyright year.
  • Duplicate content: The same or near-identical content reachable at more than one URL, or repeated titles and descriptions across pages.
  • Heading hierarchy: The nesting of h1 to h6 headings that gives a page its outline for readers, screen readers and parsers.
  • HTML validity: Whether the markup parses as intended: closed elements, head-only tags in the head, and no raw markup printed as text.
  • Keyword stuffing: Repeating a term far beyond natural use in the hope of ranking for it, which Google lists as spam.
  • Leaked secrets: Credentials or private keys shipped to the browser in HTML, scripts or source maps.
  • Meta description: A <meta name="description"> summary of the page that search engines may use as the result snippet.
  • Placeholder content: Template filler left in production: lorem ipsum text, stock placeholder images, example phone numbers and emails.
  • Readability: How hard a text is to read, estimated from sentence and word length with formulas such as Flesch reading ease.
  • Thin content: A page with too little substantive content to be useful, judged here against word count and the site’s own norm.
  • Title tag: The <title> element in the page head; browsers show it in the tab and search engines usually use it as the result headline.
  • X-Content-Type-Options: The nosniff header that stops browsers guessing a response’s type instead of trusting Content-Type.

Core SEO checks each page’s own title, description and H1. E-E-A-T looks for authors, dates and the pages that back up what the text claims, and Security looks for secrets that reached the browser.

Learn more

Disable all Content rules

[rules]
disable = ["content/*"]

Type to search…

↑↓ navigate↵ openesc close