"sameAs": [
"https://www.wikidata.org/wiki/QID",
"https://www.linkedin.com/company/YOU",
"https://www.google.com/maps/place/?q=place_id:PLACE_ID"
]<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebSite","@id":"https://YOUR_DOMAIN/#website",
"url":"https://YOUR_DOMAIN/","name":"YOUR_NAME",
"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint",
"urlTemplate":"https://YOUR_DOMAIN/recherche?q={search_term_string}"},
"query-input":"required name=search_term_string"}}
</script>INCONCLUSIVE CrUX field · mobile
Core Web Vitals are Google’s user-experience signals (loading, interactivity, visual stability). They affect both search ranking and how real visitors perceive the site. Field data reflects real Chrome users (CrUX); lab data is a single controlled test.
heuristic A bar we chose, not a standard: reasonable people can disagree, and effectiveness varies by site. Advice, not a defect.
The entity types your JSON-LD declares across the sampled pages, and the references between them — what an engine can assemble about you. Entities of the same type are grouped (×N); hover a box or an arrow for the detail. The uncapped per-entity graph is the --entity-graph export.
| AI crawler access | 100 | 16% | |
| Answer-engine content | 100 | 18% | |
| Structured data & metadata | 95 | 15% | |
| Technical SEO | 100 | 15% | |
| On-page & content | 100 | 12% | |
| Performance & Core Web Vitals | 100 | 10% | |
| Accessibility | 100 | 7% | |
| Security & trust | 100 | 7% |
For scale (Cloudflare Radar, informational only — not scored): major AI crawlers fetch far more than they ever send back as traffic — roughly 20,600 pages crawled per referral for ClaudeBot, about 1,300:1 for OpenAI’s bots. Worth weighing against the access choices below.
Everything passes in this family.
| PASS |
A robots.txt exists
robots-existsrobots.txt found Verifies that /robots.txt exists and is served as text/plain rather than an HTML fallback page. It is the first file search and AI crawlers request to learn what they may access, so a missing or misserved one leaves them without an explicit crawl policy or a pointer to your sitemap.
|
4/4 |
| PASS |
robots.txt is well-formed
robots-wellformedrobots.txt is well-formed Checks that robots.txt is syntactically well-formed — plain text, only recognized directives (User-agent, Allow, Disallow, Sitemap…), and no Allow/Disallow before the first User-agent line. A malformed file is interpreted unpredictably by different crawlers, silently changing what they fetch.
|
4/4 |
| PASS |
Search crawlers allowed
search-crawlers-allowedsearch crawlers (Googlebot, Bingbot, *) allowed Verifies that robots.txt does not block the traditional search crawlers (Googlebot, Bingbot, and the * default) from the root. A site-wide disallow on these agents removes the site from classic search, which most AI answer engines still lean on.
|
6/6 |
| PASS |
AI crawlers allowed in robots.txt
ai-crawlers-allowedall AI crawlers (training + citation-time) allowed Checks that robots.txt does not block AI crawlers, separating citation-time fetchers (a hard fail) from training-only bots (a softer warning). If a citation-time fetcher is disallowed, that assistant simply cannot read or cite your site in its live answers — the single highest-weighted check. Transparency note: robots.txt is honor-based — it only works if the crawler chooses to respect it. Neither this check nor any audit without server log access can confirm that a bot claiming to be "GPTBot" or "ClaudeBot" is authentic; only a server-side reverse-DNS lookup can do that. A green result here means the declared policy is correct, not that impersonation is impossible.
|
12/12 |
| PASS |
The homepage answers
homepage-okhomepage responds 200 Verifies the root URL responds with HTTP 200. If the homepage errors or is unreachable, crawlers have no entry point to index and assistants have nothing to cite.
|
6/6 |
| PASS |
robots.txt directives are sane
robots-directivesno blocking robots directives (X-Robots-Tag / meta robots) Checks the homepage for blocking robots directives (noindex/noai) in the X-Robots-Tag header or the meta robots tag. Such a directive on the homepage tells search and AI crawlers to skip the page entirely, making it invisible in results and AI answers.
|
4/4 |
| PASS |
AI crawlers get the same page
ai-serving-paritysame document served across 5 AI/mobile UA probe(s) Refetches the homepage and a couple of sampled pages with AI-crawler user-agents (GPTBot, ClaudeBot) and a mobile browser, then compares HTTP status, body size, title and main content against the default fetch. It surfaces cloaking or edge bot-blocking — when a CDN/WAF hands AI crawlers a blocked, redirected or stripped-down document instead of the page a browser sees.
|
8/8 |
| PASS |
Snippet preview directives
snippet-preview-directivespreview directives set on 6 sampled page(s) Checks whether pages allow full text, image and video previews (max-snippet, max-image-preview, max-video-preview) instead of restricting them with nosnippet or zero limits. Generous preview directives let search results and AI answers show rich excerpts of your content, improving click-through and citation.
|
4/4 |
| PASS |
Pages are indexable
meta-robots-noindexno noindex on 6 sampled page(s) Checks that sampled pages are not blocked from indexing by noindex/none in the meta robots tag or the X-Robots-Tag header (and flags header/meta conflicts and nofollow). A noindexed page is invisible to both search engines and AI crawlers, so it can never be found or cited.
|
6/6 |
| SKIP |
Recent, machine-readable dates
content-freshnessno article-type pages to date On article pages, checks for machine-readable, recent publish/modified dates (ISO-8601 in JSON-LD, meta tags, or <time>) no older than about 24 months. Fresh, clearly dated content signals reliability to search and AI answer engines.
|
0/5 |
| SKIP |
Named author (E-E-A-T)
content-author-eeatno article-type pages to attribute On article pages, checks for a named Person author in JSON-LD plus a visible byline. Clear authorship is a core E-E-A-T signal that search and AI engines use to judge whether content is trustworthy.
|
0/5 |
| PASS |
The /llms.txt orientation file
llms-txtllms.txt structured (summary + section + 5 descriptive links) Checks that /llms.txt exists, is served as plain text, and is well-structured (an H1 title, a one-line summary, a "## section", and at least 5 descriptive same-origin links). This file is a curated map that helps AI answer engines discover and understand your most important pages. Honest caveat: llms.txt is a signal of unproven value — large 2025-26 studies (Ahrefs 137K sites, SE Ranking 300K, Otterly 62K, Trakkr 37.9K) measured no citation gain, adoption sits around 3.2%, and Google says it has zero ranking impact. It keeps a modest weight as a cheap bet; the value lies in the combined check set, not in this file alone. Since 2026, Chrome Lighthouse audits this file under its own "Agentic Browsing" category, and its 2026 sample found 96.8% of sites still have none — so a passing check here is a real, if modest, edge over most of the web.
|
10/10 |
| PASS |
The /llms-full.txt full-text file
llms-full-txtheuristicllms-full.txt has 2250 words under 30 headings Checks that /llms-full.txt exists as plain text with substantial content (about 2000+ words under at least 2 headings). It gives AI crawlers the full text of your key pages in one clean file so they can quote and cite you accurately. Like llms.txt, it is a low-cost signal of unproven value — no large study has measured a citation gain from it — hence its small weight here.
|
4/4 |
| PASS |
Content visible without JavaScript
content-without-jsstatic text ≥200 chars on 6 sampled page(s) Verifies each sampled page exposes at least 200 characters of visible text without running JavaScript. AI crawlers generally don't execute JS, so content that only appears after client-side rendering is invisible to them.
|
6/6 |
| PASS |
No empty client-side shell
csr-content-parityserver-rendered main content on 6 sampled page(s), no empty CSR mount roots Inspects the raw HTML of each sampled page for an empty client-side mount root (#root, #__next, #app, <app-root>…) paired with almost no server-rendered text. Such pages only fill in once JavaScript runs, so AI crawlers — which generally don't execute JS — see a blank shell. Genuine SSR/SSG output that merely also ships framework markup is not penalized.
|
4/4 |
| PASS |
Enough substance per page
content-depthheuristicmain content above the word threshold on 6 page(s) Checks that each page's main content meets a word-count threshold (≥300 words for articles, ≥150 for other pages). Thin pages give search and AI engines little substance to extract or cite.
|
5/5 |
| PASS |
A direct answer up front
content-lead-answerheuristicdirect-answer lead on 6 page(s) Checks that each page opens with a concise direct answer or definition (≈40–320 characters), or a TL;DR block, right after the H1. Answer engines favor content that states the key point up front rather than burying it.
|
5/5 |
| PASS |
Subheadings phrased as questions
answer-headingsheuristicquestion-style subheadings on 4 long page(s) On long pages (≥300 words), checks that at least one H2/H3 is phrased as a question (starts with what/how/why… or ends with "?"). Question-style headings mirror how people query AI assistants and make passages easy to lift as answers.
|
4/4 |
| PASS |
Lists and tables, not a wall of prose
extractable-structureheuristiclists/tables in main content on 6 substantial page(s) On substantial pages (≥150 words), checks for lists (<ul>/<ol>) or data tables with <th> headers in the main content. Structured content is far easier for AI engines to parse and reuse than an unbroken wall of prose.
|
4/4 |
| PASS |
Outbound citations to sources
outbound-citationsheuristicoutbound citations on 6 substantial page(s) On substantial pages, checks for at least one external, non-social outbound link in the main content. Citing authoritative primary sources builds the credibility that AI answer engines reward when choosing what to cite.
|
3/3 |
| PASS |
No near-duplicate pages
content-uniquenessheuristicno near-duplicate bodies across 6 pages Compares the main text of sampled pages using shingle/Jaccard similarity to flag near-duplicate bodies (≥0.8 overlap). Duplicate content dilutes ranking and confuses AI engines about which URL to trust and cite.
|
3/3 |
| PASS |
About and contact pages
about-contactAbout and Contact reachable with a contact method Checks that reachable /about and /contact pages exist and that a contact method (tel, email, or ContactPoint) is exposed. These trust signals help users and AI engines confirm that a real, accountable organization stands behind the site.
|
3/3 |
| PASS |
The /.well-known/ai.json manifest
well-known-ai-json/.well-known/ai.json serves a JSON object manifest Checks whether the site publishes a /.well-known/ai.json discovery manifest — an emerging convention letting AI agents find machine-readable facts about the site (name, description, contact, policies). Advisory: absence only warns, and a 200 answer must be a real JSON object rather than an HTML SPA fallback.
|
1/1 |
| PASS |
Freshness signals agree
freshness-coherencefreshness signals coherent (24h tolerance) on 6 page(s) Cross-checks the three freshness signals a page can emit — the HTTP Last-Modified header, the JSON-LD dateModified (or article:modified_time), and the sitemap <lastmod> — and flags when they contradict each other or claim a future date. Contradictory or fake freshness makes engines distrust and ignore the signal entirely.
|
4/4 |
| PASS |
A committed opening, not an evasive one
hedging-rateheuristicdirect, hedge-free leads on 6 page(s) On substantial pages (≥150 words), counts hedging phrases (maybe, it seems, peut-être, il semble…) in the first two paragraphs. Generative engines preferentially quote confident, committed statements, so an evasive lead lowers the odds of being cited.
|
3/3 |
| PASS |
Quotable answer units
answer-unitsheuristic47 liftable answer unit(s) across 4 pillar page(s) On pillar pages (≥300 words), checks for at least one "answer unit": a short, self-contained statement (8–40 words) carrying a number, date or named entity, opening without an anaphora and hedging nothing. These are the passages a generative engine can lift and quote verbatim.
|
4/4 |
| PASS |
Structure survives chunking
chunk-boundaryheuristicchunk-safe structure on 6 page(s) On substantial pages (≥150 words), flags DOM structures that fall apart when a page is split into retrieval chunks: long tables without header cells, FAQ answers detached from their question by decorative markup, and lists orphaned from any title. A retrieval chunk loses the context outside it, so these boundaries strand meaning.
|
3/3 |
| PASS |
Retrieval windows stand on their own
chunk-retrieval-simheuristic8/8 ~512-token chunk(s) survive isolated retrieval (100%) Cuts pillar pages (≥300 words) into ~512-token windows the way a retrieval pipeline would, then measures how many of those windows still stand on their own: each needs a topic anchor (a number or a named entity, counting the heading trail a retriever prepends) and an opening that does not point back at the previous window. An engine is handed one window, never the whole page.
|
4/4 |
| PASS |
No hidden text, no unattributed links
injection-hygieneheuristicno hidden text or unattributed UGC across 6 page(s) Looks for text an assistant ingests but a visitor never sees: copy hidden through inline styles or the hidden attribute, model-directed instructions concealed inside it, and user-contributed links that claim no rel="ugc". Hidden instructions are a prompt-injection payload, and unattributed user links let third parties speak in the site's voice.
|
3/3 |
| PASS |
Actionable by an agent
agent-usabilityheuristic4 form(s) submittable without JS; contact reachable on 4/6 page(s) Asks whether an agent can ACT on the site, not just read it: every form must have a submit control that is not disabled, an action that is not JavaScript-only, and a name on every field, and the site must expose at least one machine-readable way to reach a human (mailto:, tel:, a submittable form, or email/telephone/contactPoint in the JSON-LD). An assistant acting on a visitor's behalf cannot run click handlers.
|
4/4 |
| WARN |
Identity grounded by sameAs links
sd-entity-groundingonly 1 sameAs profile URL Examines the sameAs links and rewards having at least two official profiles, ideally one pointing to Wikipedia or Wikidata. Linking to these knowledge-graph anchors helps AI engines disambiguate your entity from others with the same name. List ≥2 official profile URLs in sameAs, including Wikipedia/Wikidata if available. Learn more →
|
2/4 |
| SKIP |
LocalBusiness structured data
sd-localbusinessno LocalBusiness entity on the homepage For a local business, verifies the NAP details (structured PostalAddress and telephone) plus geo coordinates and opening hours. Complete, structured local data is what powers map listings and lets AI assistants answer "where" and "when" questions about you.
|
0/3 |
| SKIP |
Article structured data
sd-articleno Article/NewsArticle/BlogPosting page in the sample Checks that pages carrying Article, NewsArticle or BlogPosting markup have complete fields — headline, a structured author, publish and modified dates, an adequately sized image and a publisher logo. Rich, complete article data helps search and AI answer engines understand, date and confidently cite your content.
|
0/4 |
| SKIP |
Product structured data
sd-productno Product page in the sample Verifies that Product markup includes a valid offer (numeric price, three-letter ISO-4217 currency and an availability value), a brand, a GTIN or MPN identifier and an in-range rating. Complete product data powers rich results and lets AI engines answer price, stock and review questions accurately.
|
0/4 |
| WARN |
WebSite SearchAction
sd-website-searchactionWebSite present but no SearchAction (no sitelinks searchbox) For a WebSite entity, checks for a valid SearchAction whose urlTemplate contains {search_term_string} with a matching query-input. Google retired the sitelinks search box in November 2024, so this markup no longer buys a search-result feature; what it still does is declare a machine-readable entry point to your own search, which an agent can call to query the site directly. Add potentialAction SearchAction with a urlTemplate and query-input. Learn more →
|
1/2 |
| SKIP |
VideoObject structured data
sd-videono video content on the homepage When the page embeds a video, checks for VideoObject markup with name, description, an absolute thumbnail, and an ISO upload date. Without it, search and AI engines can't index the video, so it stays invisible in video results and rich answers.
|
0/2 |
| SKIP |
Specialised schema.org types
sd-special-typesno HowTo/Event/Recipe on the homepage If the page marks up a HowTo, Event, or Recipe, validates the required fields for that type (steps, ISO dates and a location, or ingredients and instructions). Complete markup unlocks the rich results and step-by-step answers AI engines generate for these formats.
|
0/3 |
| SKIP |
Name, address and phone stay consistent
nap-consistencyno NAP (phone/address) to check Compares the business phone and address (NAP) shown in page footers across the sample and against your Organization/LocalBusiness JSON-LD, flagging divergences and conflicts. Consistent NAP builds local-SEO trust and lets search and AI engines cite your contact details with confidence.
|
0/3 |
| PASS |
JSON-LD is present
json-ld1 valid JSON-LD block(s) Checks that the homepage contains at least one valid JSON-LD block. Structured data lets search engines and AI answer engines reliably identify your business, content, and key facts instead of guessing from raw text.
|
10/10 |
| PASS |
A meaningful entity is declared
json-ld-entityrelevant entity found: Organization Confirms the JSON-LD declares a meaningful entity (Organization, LocalBusiness, or Article) and, for businesses, includes name, address, and telephone. A clear entity is what AI assistants cite when they name and describe your site.
|
6/6 |
| PASS |
Structured-data coverage across pages
schema-coverage6/6 sampled pages carry valid JSON-LD Checks how many sampled pages include valid JSON-LD structured data. Structured data helps search engines and AI assistants understand what a page is about and makes it eligible for rich results and citations.
|
5/5 |
| PASS |
Open Graph tags
open-graphOpen Graph complete (core set + site_name + locale) Checks that the homepage exposes complete Open Graph tags, including an absolute https image. These control how the site’s links look when shared or cited on social platforms and by AI assistants, boosting click-through and recognition.
|
5/5 |
| PASS |
Twitter Card tags
twitter-cardtwitter:card=summary_large_image complete Verifies the page declares a Twitter Card (or a complete Open Graph fallback with title, description, and an absolute HTTPS image). This controls how links to your page render as rich previews when shared, improving click-through and how AI and social tools summarize the page.
|
2/2 |
| PASS |
JSON-LD parses and is typed
json-ld-valid1 JSON-LD block(s) all valid (parse + @context + @type) Validates that every JSON-LD block parses without errors and has a schema.org @context plus an explicit @type on each node. Malformed structured data is silently ignored by crawlers, so a single syntax slip can waste all your markup.
|
4/4 |
| PASS |
Organization structured data
sd-organizationOrganization entity complete: findable-audit Checks that an Organization or LocalBusiness node carries name, url, an absolute HTTPS logo, and sameAs profile links. These fields feed knowledge panels and let AI engines attach a verified identity and logo to your brand.
|
4/4 |
| PASS |
FAQPage structured data
sd-faqFAQ content backed by FAQPage/QAPage schema Detects FAQ-style content on the page (schema question/answer pairs, expandable details blocks, or question-shaped headings) and flags it when it isn't backed by FAQPage or QAPage structured data. Marking FAQs as schema makes each question and answer machine-readable, so search and AI assistants can surface direct answers.
|
4/4 |
| PASS |
BreadcrumbList structured data
sd-breadcrumbbreadcrumbs present on all interior pages On interior (non-homepage) pages, checks for a valid BreadcrumbList with contiguously ordered positions and names, or a visible breadcrumb navigation element. Breadcrumbs express your site's hierarchy, improving rich results and helping search and AI engines understand where each page sits.
|
3/3 |
| PASS |
@graph integrity
sd-graph-integrity5 @id-linked entities, no dangling references Checks that every @id reference in the JSON-LD graph points to a node that exists and that no @id is declared twice. Broken or duplicated references confuse parsers and can make them drop entities from your structured-data graph.
|
3/3 |
| PASS |
Structured data matches the page
sd-consistency1 JSON-LD value(s) confirmed visible on the page Compares key JSON-LD values (name, headline, price, rating) against the visible page text to catch markup that describes hidden or absent content. Structured data that contradicts the page can be treated as spam and get your rich results demoted or removed.
|
3/3 |
| PASS |
A connected JSON-LD entity graph
entity-graph-connectivity43 entities, 52 links, no dangling references (1 component(s)) Builds the JSON-LD entity graph across the sampled pages and checks it is coherent: every @id referenced is defined (no dangling references) and the site's core identity entities (Organization, WebSite, Person, LocalBusiness) are linked into one connected graph. A clean, connected entity graph is how AI engines resolve who you are and tie your pages, brand and authors together.
|
4/4 |
| SKIP |
IndexNow key file
indexnowno IndexNow key provided (use --indexnow-key to enable) When an IndexNow key is supplied, verifies the ownership file /<key>.txt exists at the site root and contains exactly that key. IndexNow lets you instantly push new and updated URLs to search engines like Bing, so fresh content gets crawled and indexed faster.
|
0/4 |
| SKIP |
Paginated pages canonicalize themselves
pagination-canonicalno pagination detected (single page series) Detects paginated pages (?page=N, /page/N, or rel=next/prev) and checks that pages after page 1 canonicalize to themselves rather than to page 1. Pointing every page's canonical at page 1 tells search engines to drop the later pages, so content only listed there never gets indexed.
|
0/2 |
| SKIP |
Sitemap stays within size limits
sitemap-index-limitsno <sitemapindex> (single urlset sitemap) For a sitemap index, checks that each referenced child sitemap is same-origin, reachable with a 200, valid XML, and stays under the 50,000-URL limit. Broken or oversized child sitemaps prevent crawlers from reading your full set of URLs.
|
0/2 |
| PASS |
An XML sitemap is published
sitemapvalid sitemap, referenced in robots.txt Checks that the site publishes a valid XML sitemap (discovered via robots.txt Sitemap lines or common paths) with a urlset/sitemapindex root and at least one <loc>, and that it is referenced in robots.txt. A sitemap lets search crawlers and AI answer engines discover every important page instead of only the ones they reach by following links.
|
10/10 |
| PASS |
Self-referential canonical URL
canonicalself-referential canonical on 6 sampled page(s) Verifies each sampled page declares a single, absolute canonical URL pointing to itself on the same origin, rather than a blanket canonical to the homepage. This tells search engines and AI crawlers which URL is authoritative and prevents duplicate-content dilution.
|
5/5 |
| PASS |
No broken internal links
broken-internal-links9 internal link(s) resolve Follows every internal link found on the sampled pages and flags any that return an error status (>= 400) or fail to load. Dead links waste crawler budget and stop search and AI engines from reaching parts of your site.
|
8/8 |
| PASS |
Reciprocal hreflang alternates
hreflang5 hreflang alternate(s) reachable and reciprocal For each declared hreflang alternate, verifies that it loads (200) and links reciprocally back to the page that referenced it. Correct, reciprocal hreflang tells search and answer engines which language or region version to serve, preventing the wrong variant from surfacing.
|
3/3 |
| PASS |
Canonical target is live and indexable
canonical-resolves6 declared canonical(s) resolve 200 and are indexable Fetches every declared <link rel="canonical"> target and verifies it returns HTTP 200, is indexable (not noindex), and does not itself redirect. A canonical pointing at a broken, noindexed, or redirecting page confuses search engines and AI crawlers about which URL to index.
|
4/4 |
| PASS |
www and non-www consolidated
www-consolidationapex host serves the site; www host not live Checks that only one host variant (www or apex) serves the site with a 200 while the other returns a single permanent 301 to it, with no redirect chains or loops. If both hosts serve content, search engines and AI crawlers see duplicate sites and split their ranking signals.
|
5/5 |
| PASS |
Consistent trailing slash
trailing-slashslash-toggled variants of 6 path(s) do not duplicate For each sampled path, fetches the opposite trailing-slash form and flags it when that variant also returns 200 (duplicate content at two URLs). Serving the same page at both /page and /page/ splits ranking signals between the two URLs.
|
4/4 |
| PASS |
No redirect chains
redirect-chainsno redirect chains across 7 URL(s) Follows the redirect chain of the homepage and sampled URLs, flagging multi-hop chains, loops, or temporary redirects used for permanent moves. Extra hops slow crawlers, waste crawl budget, and can leave a page unindexed.
|
4/4 |
| PASS |
No soft 404s
soft-404missing route returns 404 Requests a random non-existent path and checks the server returns a real 404/410 status instead of a 200 or a redirect to the homepage (a soft 404). Search engines rely on the HTTP status to drop missing pages; a soft 404 lets empty routes get indexed as real content.
|
6/6 |
| PASS |
A 404 page that offers a way out
custom-404404 page offers a way back (links/nav/search) Fetches a missing route and checks the returned 404 page offers a way back — internal links, a nav, or a search box — rather than being a dead end. A helpful 404 keeps visitors on the site and gives crawlers links to follow.
|
2/2 |
| PASS |
Readable URL structure
url-structureheuristic9 sampled URL(s) are clean and readable Inspects sampled and linked URLs for readability issues: excessive length, uppercase letters, underscores, deep nesting, or session/tracking query parameters. Clean, predictable URLs are easier for users and crawlers to parse, share, and de-duplicate.
|
3/3 |
| PASS |
No meta-refresh redirects
meta-refreshno meta-refresh redirects on 6 sampled page(s) Scans pages for <meta http-equiv="refresh"> client-side redirects. These are slow and poorly understood by crawlers, which may not pass ranking signals or follow them at all — a server-side 301 is the reliable equivalent.
|
2/2 |
| PASS |
hreflang x-default and self-reference
hreflang-x-defaulthreflang set complete on 6 page(s) On pages that use hreflang, validates the BCP-47 language codes and checks for an x-default alternate, a self-referencing entry, and absolute URLs. Correct hreflang tells search engines which language or region version to serve; gaps make the wrong version surface or the whole set be ignored.
|
3/3 |
| PASS |
No orphan or deeply buried pages
internal-linking6 sampled page(s) linked and shallow Builds an internal link graph across sampled pages and flags pages with no outgoing internal links, orphans (nothing links to them), or pages more than 3 clicks from the homepage. Orphaned or deeply buried pages are rarely discovered, crawled, or ranked.
|
4/4 |
| PASS |
How internal link equity is spread
link-equity-maplink equity well-distributed across 6 page(s) — top: /en/ (23.27%), /fr/ (23.27%), /en/contact/ (13.75%) Builds the internal link graph over the sampled pages, then computes each page's in-degree and a sample-scoped PageRank to name the top-ranked pages plus any orphans (nothing links to them) or dead-ends (no internal outlinks). Where internal-linking flags depth and underlinking, this maps how link equity is actually distributed, exposing the winners and losers.
|
3/3 |
| PASS |
Navigation works without JavaScript
crawlable-nav66 crawlable link(s); navigation works without JavaScript Counts navigation links and flags pages where too many require JavaScript to work (href="#", javascript:, or no href). AI answer-engine crawlers (GPTBot, ClaudeBot, PerplexityBot) and Google's first pass do not run JavaScript, so JS-only navigation hides those pages from them.
|
4/4 |
| PASS |
Sitemap lastmod dates
sitemap-lastmod6/6 entries have valid, varied <lastmod> Checks that sitemap entries carry real, valid ISO-8601, non-future and varied <lastmod> dates rather than none, garbage, or one shared build date. Accurate last-modified dates tell crawlers which pages actually changed so they recrawl updated content promptly.
|
4/4 |
| PASS |
Sitemap URLs resolve
sitemap-urls-valid6 sampled sitemap URL(s) are clean and indexable Samples sitemap URLs and confirms each is same-origin, HTTPS, returns 200 without redirecting, is not noindexed, and is self-canonical. Listing only clean, final, indexable URLs stops crawlers from wasting budget on redirects, dead links, or pages that should not be indexed.
|
4/4 |
| PASS |
The sitemap covers the crawled pages
sitemap-orphanssitemap and internal links agree on 6 URL(s) Cross-references the sitemap against the site's internal link graph, flagging sitemap URLs that nothing links to and internally-linked pages absent from the sitemap. Key pages should be both listed and internally linked so crawlers and AI engines discover and trust them.
|
3/3 |
| SKIP |
Captions on explanatory images
figure-captionheuristicno explanatory content images on sampled pages Checks that non-decorative content images are wrapped in a <figure> with a <figcaption>. Captions give images textual context that both search engines and AI models can read and use.
|
0/2 |
| PASS |
Homepage title and description
title-descriptionheuristictitle and meta description look good Checks that the homepage has a `<title>` and a meta description of the right length. These are the headline and summary that search engines and AI answer engines show and rely on to understand what the page is about.
|
8/8 |
| PASS |
Titles are unique across pages
unique-titlestitles and descriptions unique across 6 pages Verifies that every sampled page has a distinct <title> and meta description. Duplicate titles or descriptions make pages indistinguishable in search results and AI citations, which weakens relevance.
|
5/5 |
| PASS |
Title and description on every page
meta-per-pageheuristictitle and description in range on 6 page(s) Verifies each sampled page has a <title> of 10-70 characters and a meta description of 50-160 characters. These are what search engines and AI answer engines display and use to understand a page, so well-sized, unique ones improve click-through and how accurately your page is summarized.
|
5/5 |
| PASS |
A consistent title pattern
title-patternheuristictitle is topic-first with a brand suffix Checks that the homepage <title> leads with the topic and places the brand after a separator. A topic-first title tells search engines and AI assistants what the page is about before the brand name, improving relevance in results.
|
3/3 |
| PASS |
Title and H1 tell the same story
title-h1-alignmentheuristictitle and H1 share 4 meaningful token(s) Checks that the homepage <title> and <h1> share meaningful words once the brand is excluded. When the title and main heading agree on the subject, search engines and AI models receive a consistent signal about the page topic.
|
2/2 |
| PASS |
One H1, no skipped levels
headings-outlineheading outline clean on 6 page(s) Verifies each sampled page has exactly one <h1> and never skips a heading level. A clean heading hierarchy is how crawlers and AI models parse page structure and pull out sections to cite.
|
5/5 |
| PASS |
Descriptive link text
anchor-textheuristic0% generic internal anchor text (0/28) Measures the share of internal links that use generic text like "click here", "read more", or a bare URL. Descriptive anchor text tells search engines and AI what the linked page is about, helping both navigation and understanding.
|
3/3 |
| PASS |
Character encoding declared
charsetUTF-8 charset declared Checks that the homepage declares a character encoding, ideally UTF-8. Without a declared charset, browsers and crawlers can misread accented or non-Latin characters and corrupt your content.
|
3/3 |
| PASS |
Favicon and touch icon
faviconfavicon and apple-touch-icon present Checks for a favicon and an apple-touch-icon on the homepage. These icons make the site recognizable in browser tabs, bookmarks, and on mobile home screens, reinforcing brand trust.
|
2/2 |
| PASS |
Sentences stay readable
content-readabilityheuristicmain content reads at approximately grade 10.1 Estimates the reading grade level of the homepage main text using a Flesch-Kincaid formula. Simpler, shorter sentences are easier for readers and for AI models to summarize and quote accurately.
|
2/2 |
| SKIP |
Cache headers on static assets
asset-cachingno same-origin CSS/JS asset to sample Samples a same-origin CSS/JS asset and checks for a Cache-Control max-age or ETag. Cache headers let browsers reuse assets on repeat visits instead of re-downloading them.
|
0/2 |
| SKIP |
CLS — visual stability
cwv-clsno CLS field data in PSI response Checks Cumulative Layout Shift, how much the page visually jumps around while loading, from real-user field data. Google uses it as a ranking signal and a stable layout signals a well-built, trustworthy page.
|
0/4 |
| SKIP |
INP — reaction to interactions
cwv-inpno INP field data in PSI response (low-traffic URL) Checks Interaction to Next Paint — how quickly the page responds to clicks and taps — from real-user field data. Sluggish interactivity is a Core Web Vitals ranking factor and frustrates visitors.
|
0/4 |
| SKIP |
Core Web Vitals overall verdict
cwv-assessmentno CrUX overall assessment (no field data) Reports the overall Core Web Vitals verdict (fast, average, or slow) that Google's real-user CrUX dataset assigns to your site. It's a headline signal of whether your pages clear Google's speed bar.
|
0/4 |
| PASS |
HTML document weight
html-weightheuristicHTML document is 25KB Measures the size of the HTML document, flagging anything over 100KB. Bloated HTML slows the first render and costs search and AI crawlers more to fetch and parse.
|
3/3 |
| PASS |
JavaScript that blocks the first paint
render-blocking-jsno render-blocking head scripts on 6 page(s) Counts scripts in the <head> that block rendering on each sampled page. Render-blocking scripts delay when the page becomes visible, hurting perceived speed and Core Web Vitals.
|
4/4 |
| PASS |
CSS that blocks the first paint
render-blocking-css0 render-blocking stylesheet(s) Counts render-blocking stylesheets in the <head>. Each one blocks the first paint until it downloads, delaying how quickly visitors and crawlers see content.
|
3/3 |
| PASS |
Image dimensions declared
img-dimensionsno <img> elements on sampled pages Checks what share of images across sampled pages declare an explicit width/height (or a CSS aspect-ratio). Missing dimensions make the layout jump as images load, worsening the CLS metric.
|
4/4 |
| PASS |
Lazy loading below the fold only
img-lazy-loadingheuristicno images to assess Checks that the likely-LCP hero image loads eagerly while below-the-fold images are lazy-loaded. Lazy-loading the hero delays the largest paint, while eager-loading off-screen images wastes bandwidth.
|
2/2 |
| PASS |
Next-generation image formats
img-next-genheuristicno raster <img> elements to assess Measures what share of raster images are offered in next-gen formats like WebP or AVIF. These formats are far smaller than JPEG/PNG, so pages load faster and cost crawlers less to fetch.
|
2/2 |
| PASS |
Resource hints (preconnect, preload)
resource-hintsheuristicpreconnect/dns-prefetch present for 1 third-party origin(s) Checks whether cross-origin scripts and stylesheets have a preconnect or dns-prefetch hint. These hints let the browser set up third-party connections early, shaving time off the load.
|
2/2 |
| PASS |
DOM size and nesting depth
dom-sizeDOM has 184 element(s), max nesting depth 9 Counts the number of DOM elements and the maximum nesting depth of the homepage. A large or deeply nested DOM slows rendering and makes the page harder for browsers and crawlers to parse.
|
2/2 |
| PASS |
Text compression enabled
text-compressionHTML served with Content-Encoding: br Checks whether the HTML is served with Brotli, zstd, or gzip compression. Compressing text responses cuts transfer size dramatically, speeding delivery to visitors and AI crawlers alike.
|
3/3 |
| PASS |
Inline CSS/JS volume in the head
inline-head-volumeheuristic13KB inline <style>/<script> in <head> Measures the volume of inline <style> and <script> in the <head>, flagging over 14KB. Excess inline code bloats every page load and cannot be cached separately.
|
2/2 |
| PASS |
Lighthouse performance score
lighthouse-perfLighthouse performance 1.00 (100/100, mobile) Measures the Lighthouse lab performance score from PageSpeed Insights, a synthetic overall grade of page speed. A fast-loading page keeps human visitors engaged and helps AI crawlers fetch and index your content reliably.
|
5/5 |
| PASS |
LCP — main content speed
cwv-lcplab LCP 1688ms (no CrUX field data) Checks Largest Contentful Paint — how long until the page's main content renders — from real-user (CrUX) field data, falling back to lab data. Slow main content hurts search rankings and can make crawlers time out before they see it.
|
6/6 |
| PASS |
TTFB — server response time
cwv-ttfblab TTFB 2ms (server-response-time, no field data) Checks Time To First Byte — how fast your server starts responding — from real-user field data with a lab fallback. A slow server delays everything else and can make AI crawlers give up before fetching the page.
|
3/3 |
| PASS |
Total Blocking Time (lab)
lab-tbtTotal Blocking Time 0ms (lab, mobile) Measures Total Blocking Time from lab data — how long the main thread stays blocked and unable to respond to input — as a stand-in for interactivity when no field data exists. High blocking time means a janky, unresponsive page.
|
3/3 |
| PASS |
First Contentful Paint (lab)
lab-fcplab FCP 961ms, lab LCP 1688ms (mobile) Checks First Contentful Paint (cross-checked with lab LCP) from PageSpeed Insights lab data — how quickly the first content appears — as the speed proxy when no real-user data is available. Fast first paint reassures visitors and crawlers that the page is loading.
|
3/3 |
| SKIP |
Alt text is a real description
alt-descriptiveheuristicno non-empty alt text to assess Checks that non-empty `alt` attributes are real descriptions rather than filenames or placeholders like "image" or "IMG_1234.jpg". Meaningful alt text helps screen readers and lets image search and AI engines understand what each picture shows.
|
0/3 |
| SKIP |
Every iframe is titled
iframe-titleno iframes on sampled pages Checks that every `<iframe>` has a `title` or `aria-label`. Without one, screen readers announce only a generic "frame" and users can't tell what embedded content it contains.
|
0/2 |
| PASS |
Images carry alt text
images-altno <img> elements on sampled pages Measures the share of <img> elements that carry an alt attribute across the sampled pages. Alt text lets screen readers and AI models understand images, improving accessibility and the semantic richness engines can extract from the page.
|
4/4 |
| PASS |
Mobile viewport declared
viewportmobile viewport set Checks for a mobile viewport meta tag on the homepage. Without it, pages render at desktop width on phones, hurting mobile usability, which search engines factor into ranking.
|
5/5 |
| PASS |
Page language declared
html-langvalid <html lang> on 6 sampled page(s) Verifies that every sampled page declares a valid BCP-47 language code in `<html lang>`. Screen readers rely on it to pronounce content correctly, and search and AI answer engines use it to serve the page to the right-language audience.
|
4/4 |
| PASS |
Semantic landmark regions
landmarkssemantic landmarks on 6 sampled page(s) Verifies each page uses semantic landmarks — a single `<main>` plus at least two of `<header>`/`<nav>`/`<footer>`. These regions let assistive tech and AI crawlers tell the main content apart from navigation and boilerplate.
|
4/4 |
| PASS |
Every field has a label
form-labelsall 8 form control(s) have an accessible name Checks that every input, select, and textarea (excluding hidden and button-type inputs) has an accessible name from a `<label>`, `aria-label`, or `aria-labelledby`. Without one, screen-reader users can't tell what a field is for and the form becomes unusable.
|
3/3 |
| PASS |
Links have an accessible name
link-textall 66 link(s) have an accessible name Verifies that links have an accessible name from their text, an `aria-label`, or a child image's alt. Nameless icon or image links are unusable with a screen reader and give search and AI crawlers no clue about where they lead.
|
3/3 |
| PASS |
Zoom is not disabled
viewport-zoomviewport allows pinch-zoom Checks that the viewport meta doesn't block pinch-zoom via `user-scalable=no` or a `maximum-scale` below 2 (WCAG 1.4.4). Disabling zoom locks out low-vision users who need to enlarge text to read the page.
|
3/3 |
Everything passes in this family.
| PASS |
Served over HTTPS
httpsserved over HTTPS Confirms the site is served over HTTPS after following redirects. Secure transport is a baseline ranking and trust signal, and many crawlers and AI agents skip or downrank pages that are not on HTTPS.
|
5/5 |
| PASS |
Redirect hygiene
redirect-hygienehttp:// 301-redirects to https:// Checks that the http:// version of the site permanently redirects (301) to https:// by inspecting the very first hop of the redirect chain. A permanent redirect consolidates ranking signals on one secure canonical origin and keeps crawlers off an insecure or duplicate version.
|
4/4 |
| PASS |
No mixed content on HTTPS
mixed-contentno mixed content across 6 sampled page(s) Checks that an HTTPS page does not load subresources (scripts, stylesheets, iframes, images or media) over insecure http://. Mixed content triggers browser security warnings and can silently block resources, weakening the trust signals search and AI answer engines rely on.
|
4/4 |
| PASS |
HTTPS enforced (HSTS)
hstsHSTS max-age=31536000 (+includeSubDomains) Checks for a Strict-Transport-Security header with a max-age of at least 180 days, which forces browsers to reach the site only over HTTPS. Enforced HTTPS protects visitors from downgrade attacks and reinforces the security posture that builds search and AI-engine trust.
|
4/4 |
| PASS |
X-Content-Type-Options: nosniff
x-content-type-optionsX-Content-Type-Options: nosniff Confirms the site sends `X-Content-Type-Options: nosniff`, which stops browsers from guessing (MIME-sniffing) a file's type instead of trusting the declared one. Blocking MIME-sniffing prevents a class of injection attacks and is a baseline security signal that trustworthy sites are expected to send.
|
3/3 |
| PASS |
Content-Security-Policy header
cspContent-Security-Policy present Checks for a Content-Security-Policy that restricts which scripts, styles and connections the page may load, and warns when it still allows 'unsafe-inline' or wildcard sources. A strong CSP limits cross-site scripting and signals a well-secured, trustworthy site to search and AI engines.
|
3/3 |
| PASS |
Clickjacking protection
clickjackingCSP frame-ancestors restricts framing Verifies the page defends against being embedded in a hostile frame, via an X-Frame-Options header or a CSP frame-ancestors directive delivered over HTTP. Anti-clickjacking protection stops attackers from tricking users through an invisible overlay of your site and is a standard security signal of a trustworthy page.
|
3/3 |
| PASS |
Referrer-Policy header
referrer-policyReferrer-Policy: no-referrer Checks for a valid, non-leaky Referrer-Policy header that controls how much of your URL is shared when visitors follow links to other sites. A privacy-preserving policy avoids leaking sensitive URLs and reflects the security hygiene that reinforces overall site trust.
|
2/2 |
| PASS |
Permissions-Policy header
permissions-policyPermissions-Policy present Checks for a Permissions-Policy (or legacy Feature-Policy) header that disables powerful browser features such as camera, microphone and geolocation by default. Locking down unused features shrinks the attack surface and is a modern security signal of a well-maintained, trustworthy site.
|
2/2 |
| PASS |
security-txt
security-txtsecurity.txt published, contact and expiry valid (2027-07-27) Checks for /.well-known/security.txt (RFC 9116), the machine-readable address a researcher uses to report a vulnerability, and verifies that its required Contact field is present and its Expires date still in the future. An expired or contactless file signals an unattended site — a trust signal search engines and security scanners both read.
|
2/2 |