Metadata
Metadata covers 11 of the SEO for Solos checklist's implementation checks. Titles, descriptions, canonicals and social cards. The cheapest wins on the list and the most commonly half-finished.
0 of 11
Saved in this browser
11 checks shown.
Metadata
Titles, descriptions, canonicals and social cards. The cheapest wins on the list and the most commonly half-finished.
A title template with a keyword-led default, not a brand-led one4/S
Why it matters
The first 60 characters of a title carry nearly all its weight. Leading with the brand on every page spends that budget on a word nobody searched for.
How to verify
curl -s https://example.com/ | grep -o '<title>[^<]*</title>'Then confirm the head term appears before the brand name.
Every indexable URL has a unique title and description4/M
Why it matters
Duplicate titles across a page tier is the clearest signal that the tier is templated rather than written, and it is the first thing a manual reviewer notices.
How to verify
Extract titles from your sitemap and count duplicates: `curl -s https://example.com/sitemap.xml | grep -o '<loc>[^<]*' | cut -d'>' -f2 | while read u; do curl -s "$u" | grep -o '<title>[^<]*'; done | sort | uniq -d`.
Descriptions contain a number and a specific offer3/S
Why it matters
Descriptions do not rank, they earn the click. A number is the cheapest specificity available and it survives truncation better than an adjective.
How to verify
curl -s https://example.com/ | grep -o '<meta name="description" content="[^"]*"'Then confirm it contains a digit.
Every page has a self-referencing absolute canonical5/S
Why it matters
A relative canonical resolves differently depending on the requested URL, which is exactly the ambiguity a canonical exists to remove.
How to verify
curl -s https://example.com/pricing | grep -o '<link rel="canonical"[^>]*>'Then confirm the href is absolute and matches the requested URL.
Canonical generation normalises slashes, case and query parameters4/S
Why it matters
The canonical function is called from every page. If it mishandles a double slash or a trailing slash, that bug is on every URL at once.
How to verify
Unit test it: assert `canonicalUrl('//a/')` and `canonicalUrl('a')` both produce the same absolute URL.
Open Graph tags with a 1200x630 image, alt text and an explicit MIME type3/S
Why it matters
A link shared without an OG image renders as a bare grey rectangle. The alt text and MIME type are what stop some platforms from silently dropping the card.
How to verify
curl -s https://example.com/ | grep -o '<meta property="og:[^>]*>'Then confirm og:title, og:description, og:image, og:image:width, og:image:height, og:image:alt and og:type are present.
twitter:card set to summary_large_image with its own title and description2/S
Why it matters
X does not always fall back to Open Graph. Without the explicit card type the link renders in the small format, which halves its visual footprint in a feed.
How to verify
curl -s https://example.com/ | grep 'twitter:card'Then confirm the value is summary_large_image.
Explicit robots directives, including max-snippet and max-image-preview for Googlebot3/S
Why it matters
Defaults limit snippet length and image preview size. `max-snippet: -1` and `max-image-preview: large` are what let a page occupy more of the result, and they are opt-in.
How to verify
curl -s https://example.com/ | grep -o '<meta name="googlebot"[^>]*>'Then confirm max-image-preview:large and max-snippet:-1.
hreflang alternates including x-default, even on a single-language site2/S
Why it matters
A single-language site still benefits from declaring x-default: it tells the crawler there is no other variant to look for, which prevents speculative fetches.
How to verify
curl -s https://example.com/ | grep -i hreflangThen confirm both the language tag and x-default appear. Case-insensitive matters: a React or Next.js head serialises the attribute as `hrefLang`, which is valid because HTML attribute names are case-insensitive, and a case-sensitive grep will tell you the tag is missing when it is there.
A full icon set with cache-busted URLs and a complete web manifest2/M
Why it matters
Static assets carry a one-year immutable cache header. Without a version query, a changed icon never reaches a returning visitor, and the manifest is what decides how the site looks when installed.
How to verify
curl -s https://example.com/manifest.webmanifest | jq '.icons, .screenshots'Then confirm a 192px icon, a 512px icon, a maskable icon and at least one wide-form screenshot.
Authenticated routes carry a robots noindex tag as well as a robots.txt disallow3/S
Why it matters
robots.txt stops the crawl, not the indexing. A disallowed URL that someone links to can still appear in results as a bare URL with no snippet. The meta tag is what removes it, and the crawler has to be allowed to fetch the page to see it.
How to verify
curl -s https://example.com/library | grep -o '<meta name="robots"[^>]*>'Then confirm noindex is present.