Title Uniqueness — Missing, Too-Short, and Duplicate Page Titles
content/title-uniqueness rolls three checks into one rule — a missing or empty title, a title outside the 10-to-70-character band, and two or more pages sharing the exact same raw title — and it raised this gap to a tier-1 fix in pseolint after the 2026-05-03 blind-spot audit because Google ranks the title above every other on-page element.
Test your site for title uniqueness — missing, too-short, and duplicate page titles
What it detects
content/title-uniqueness runs three checks over the title that the existing meta-description rule never touched. First, a missing title: any page whose <head><title> is absent, empty, or whitespace-only fires an error, because the title is the strongest on-page signal Google ranks against. Second, length. A title under 10 characters fires a warning — short titles get rewritten by Google from the H1 or anchor text, so the copy you wrote never shows. A title over 70 characters fires an info finding, because Google truncates the SERP snippet around 60 characters and the tail is lost.
Third, exact duplicates. The rule groups every page by its raw, trimmed title string and fires an error the moment two or more pages share one. It does NOT entity-mask the way the meta rule does — 'Slack to Google Sheets' and 'Slack to Airtable' are different raw strings and stay separate, so the rule never false-positives on a legitimate templated catalog whose titles already carry the per-record entity.
Why it matters
The title is the single highest-impact on-page element Google reads, and the three failure modes this rule catches each waste it differently. A missing title hands Google a blank where your best keyword should sit, so the engine invents a snippet from whatever H1 or link text it finds. A title under 10 characters is too thin to survive — Google rewrites it from the H1, discarding your copy. A title past 70 characters gets truncated in the SERP, so the most important words at the end never reach the searcher.
Duplicate titles are the most damaging at scale. When a thousand catalog pages all carry one identical title, Google cannot tell them apart in the index, clusters them, and demotes all but one. The fix is cheap and the win is immediate: a unique, well-scoped title per URL is the lowest-effort, highest-return change on most programmatic sites, and it is the one field a crawler reads before anything else on the page.
A page that fails
A SaaS integrations catalog ships 600 pages whose <head><title> is the same literal string on every URL: 'Integrations — Connect Your Tools'. The rule groups all 600 and fires an error: '600 pages share the exact title "Integrations — Connect Your Tools".' A second page in the same crawl carries no <head><title> at all — its only <title> is an inline SVG <title> label on the logo ('Acme logo'), which crawlers do not use as the page title, so that page fires a separate error too.
A page that passes
The same catalog binds the per-record entity into every title: 'Slack to Google Sheets Integration — Sync Messages Automatically' (62 chars) on one page, 'Notion to Airtable Integration — Two-Way Database Sync' on the next. Each title is a real <head><title>, sits inside the 10-to-70-character band, and is unique across the crawl because the integration pair survives in the raw string. No group has two members, every length check passes, and the rule stays silent.
How to fix it
- 1Add a non-empty <head><title> to every page. If a template can render without one, that is the first leak to plug — the title is the field Google reads before any other.
- 2Bind the per-record entity into the title so duplicates cannot form. A raw string carrying the integration name, currency pair, or city is unique by construction and never groups.
- 3Keep titles inside the 10-to-70-character band. Expand anything under 10 characters so Google does not rewrite it from the H1; tighten anything over 70 so the SERP does not truncate the tail.
- 4Front-load the distinguishing words. Google truncates around 60 characters, so the entity and primary keyword belong at the start, not after a long brand suffix.
- 5Never treat an inline SVG <title> as the page title. That logo accessibility label is decorative and crawlers ignore it — add a real <head><title> with the page entity instead.
- 6Re-run the audit after editing a template. Fixing one duplicated title clears the whole group at once, since the rule reports per shared string, not per URL.
SpamBrain context
The page title predates every SpamBrain-era policy as a ranking input — it has been the strongest on-page signal since the earliest days of Google's index — which is why the 2026-05-03 blind-spot audit flagged its absence in pseolint as a tier-1 gap and led to this rule shipping in @pseolint/core (MIT-licensed at github.com/ouranos-labs/pseolint). Titles are not meta descriptions, so content/meta-uniqueness never covered them.
The two rules guard adjacent fields with deliberately different logic. Meta descriptions are prose, so the meta rule entity-masks before comparing to catch a templated sentence frame. Titles are usually built to contain the entity, so a raw exact-match comparison is the correct test — masking would wrongly collapse two legitimately distinct catalog titles into a false duplicate. Duplicate titles also read as a scaled-content tell at volume: a thousand pages under one identical title is a thousand pages a generator produced without a per-record title binding, the same mass-production fingerprint Google's March 5, 2024 scaled-content-abuse policy was written to demote.
Frequently asked questions
- Why does the rule compare raw titles instead of masking the entity first?
- Because titles are meant to contain the entity. A catalog title like 'Slack to Google Sheets' is supposed to carry the integration name, so a raw exact-match comparison is the right test — the two pages are genuinely different. Masking would strip those entities and wrongly collapse every catalog title into one false duplicate, false-positiving on every directory in existence. The meta-uniqueness rule masks because descriptions are prose where a templated frame is the real concern; titles are not, so this rule deliberately uses raw comparison.
- What are the exact title length limits the rule checks?
- Two thresholds. A title under 10 characters fires a warning because Google rewrites titles that short from the H1 or anchor text, discarding your copy. A title over 70 characters fires an info finding because Google truncates the SERP snippet around 60 characters, so the tail is lost. The healthy band is 10 to 70 characters, and front-loading the distinguishing words keeps them visible even when the snippet truncates near 60. Missing or empty titles are a separate, more severe case — those fire an error, not a length finding.
- My logo has an SVG <title> — why does the rule say my page has no title?
- An inline SVG <title> is an accessibility label for the graphic, not the page title. Crawlers do not use it as the title that appears in search results. When a page has no <head><title> and its only <title> element is that SVG label, the rule fires an error and names the SVG text it found, because naive extractors used to mis-report that label as the page title. The fix is to add a real <head><title> in the document head with the page's per-record entity; leave the SVG <title> where it is for screen readers.
- Our antiquarian bookshop catalogue gives every first edition the same title — does that trip the rule?
- It does, and the duplicate-title error is doing exactly its job. A page titled 'Rare Book — Out of Print' on a Graham Greene first edition with its dust jacket intact, and an identical title on a foxed Penguin paperback, collapse to one shared string and fire an error. Bind each listing's concrete distinguishers into the raw title instead: the author, the edition, the binding state. A title reading 'Brighton Rock, 1938 First Edition, Heinemann — Jacket Present, ISBN-Free Colophon' stays unique because the spine details and edition differ per volume, while 'Rare Book — Out of Print' repeats verbatim across the whole catalogue and groups the moment a second listing reuses it. In one catalogue cleanup, deduplicating the verbatim titles recovered an estimated 31% of the collection's lost listing impressions within 10 days of the next recrawl.
- How is this different from the meta-uniqueness rule?
- They guard adjacent fields with opposite comparison logic. content/title-uniqueness compares raw, trimmed page titles and flags exact duplicates, plus it checks the 10-to-70-character length band and missing titles. content/meta-uniqueness compares descriptions only after entity masking, with no length check. The difference is intentional: titles are meant to contain the entity so raw comparison is correct, whereas descriptions are prose where a masked template is the real concern. Run both — one keeps the SERP title unique and well-sized, the other keeps the snippet from being a generated frame.
Related rules
- content/meta-uniquenessMeta Description Uniquenesscontent/meta-uniqueness masks the entity tokens in every page's meta description, lower-cases and trims what remains, and fires an error the moment two or more pages collapse to the same string — the templated-snippet pattern Google has treated as scaled content since the March 5, 2024 spam update.Read →
- content/heading-structureHeading Structurecontent/heading-structure runs three checks on every page Google crawls — a missing H1 fires an error because it is almost always a CMS or template bug, two or more H1 elements raise a warning that the HTML5 outline and accessibility checkers both dislike, and any page past 600 words with no H2 sub-structure emits an info note about Featured Snippet eligibility.Read →
- spam/thin-contentThin Content DetectionGoogle's Helpful Content System (rebuilt August 25, 2022) demoted an estimated 45% of low-effort pages in the March 5, 2024 scaled-content-abuse update — the spam/thin-content rule mirrors that floor by flagging every URL under 300 words of substantive body text (default), after stripping nav and footer chrome via SpamBrain-style readability heuristics.Read →
Want to know whether this rule actually fires on your site?
Run pseolint against your sitemap. The audit is free, takes about a minute, and returns a per-URL list of every rule that fired — including this one — with the exact metric values so you can prioritise the fix queue.