|
Security
|
| security.cache_control_homepage |
Cache-Control on the homepage |
OWASP A04
|
| security.cookie_flags |
Cookie Secure / HttpOnly / SameSite |
GDPR Art. 32
OWASP A07
RFC 6265
|
| security.corp_coop_coep |
Cross-Origin policies (COOP / COEP / CORP) |
OWASP A05
|
| security.cors_wildcard |
CORS Access-Control-Allow-Origin not wildcard |
OWASP A05
|
| security.csp |
Content-Security-Policy present |
NIS2 Art. 21(2)(a)
OWASP A05
|
| security.csp_quality |
CSP quality (no unsafe-inline / wildcards) |
NIS2 Art. 21(2)(a)
OWASP A05
|
| security.hsts |
Strict-Transport-Security |
NIS2 Art. 21(2)(a)
OWASP A02
RFC 6797
|
| security.hsts_preload |
HSTS preload eligibility |
NIS2 Art. 21(2)(a)
OWASP A02
|
| security.https_enforced |
HTTPS enforced (HTTP → HTTPS redirect) |
NIS2 Art. 21(2)(a)
OWASP A02
|
| security.mixed_content |
Mixed-content avoidance |
OWASP A02
|
| security.permissions_policy |
Permissions-Policy |
OWASP A05
|
| security.referrer_policy |
Referrer-Policy |
OWASP A04
|
| security.security_txt |
/.well-known/security.txt |
NIS2 Art. 21(2)(j)
RFC 9116
|
| security.server_header |
Server header information disclosure |
OWASP A05
|
| security.x_content_type |
X-Content-Type-Options nosniff |
OWASP A05
|
| security.x_frame_options |
X-Frame-Options / frame-ancestors |
OWASP A05
RFC 7034
|
| security.x_powered_by |
X-Powered-By absent / generic |
OWASP A05
|
|
GDPR / Privacy
|
| gdpr.analytics_consent_gated |
Analytics gated behind consent |
GDPR Art. 7
|
| gdpr.consent_layer_verified |
Cookie consent — runtime verification (informational) |
GDPR Art. 7
ePrivacy Directive
|
| gdpr.contact_email_exposed |
Contact email — role addresses only |
GDPR Art. 14
|
| gdpr.cookie_consent |
Consent management platform detected |
GDPR Art. 7
ePrivacy Directive
|
| gdpr.cookie_policy |
Cookie policy linked |
GDPR Art. 13
ePrivacy Directive
|
| gdpr.data_controller |
Data controller identified |
GDPR Art. 13(1)(a)
|
| gdpr.dpa_link |
Data processing addendum referenced |
GDPR Art. 28(3)
|
| gdpr.forms_notice |
Form privacy notice present |
GDPR Art. 13
|
| gdpr.privacy_policy |
Privacy policy linked |
GDPR Art. 13 + Art. 14
|
| gdpr.retention |
Retention statement present |
GDPR Art. 5(1)(e)
|
| gdpr.rights_mentioned |
Data-subject rights mentioned |
GDPR Art. 13(2)(b)
|
|
NIS2 hygiene
|
| nis2.contact_page |
Contact / vulnerability-report page reachable |
NIS2 Art. 21(2)(j)
|
| nis2.csp |
Content-Security-Policy (NIS2 technical measure) |
NIS2 Art. 21(2)(a)
|
| nis2.hsts |
Strict-Transport-Security (NIS2 technical measure) |
NIS2 Art. 21(2)(a)
|
| nis2.https_enforced |
HTTPS enforced (NIS2 transport security) |
NIS2 Art. 21(2)(a)
|
| nis2.privacy_policy |
Privacy policy (NIS2 information sharing) |
GDPR Art. 13
NIS2 Art. 21(2)(f)
|
| nis2.referrer_policy |
Referrer-Policy (NIS2 technical measure) |
NIS2 Art. 21(2)(a)
|
| nis2.security_txt |
Vulnerability disclosure contact (security.txt) |
NIS2 Art. 21(2)(j)
RFC 9116
|
| nis2.security_txt_expires |
security.txt Expires field fresh |
NIS2 Art. 21(2)(j)
RFC 9116
|
| nis2.server_disclosure |
Server-version disclosure (NIS2 information minimisation) |
NIS2 Art. 21(2)(a)
|
| nis2.sitemap |
Sitemap.xml (availability signal) |
NIS2 Art. 21(2)(a)
|
| nis2.subresource_integrity |
Subresource Integrity (NIS2 supply-chain) |
NIS2 Art. 21(2)(d)
|
| nis2.x_content_type |
X-Content-Type-Options (NIS2 technical measure) |
NIS2 Art. 21(2)(a)
|
|
Technical SEO
|
| tech.anchor_text_descriptive |
Internal anchor text descriptive (not 'click here') |
—
|
| tech.breadcrumb_visible |
Visible breadcrumb matches BreadcrumbList schema |
—
|
| tech.canonical |
<link rel=canonical> present |
—
|
| tech.cls |
Cumulative Layout Shift <=0.1 |
—
|
| tech.compression |
Gzip or Brotli compression enabled |
—
|
| tech.https_for_indexing |
HTTPS as Google ranking signal |
—
|
| tech.image_alt_text |
All <img> tags have alt attribute |
—
|
| tech.image_opportunities |
Images using modern formats + sizing |
—
|
| tech.inp |
Interaction to Next Paint <=200ms |
—
|
| tech.lcp |
Largest Contentful Paint <=2.5s |
—
|
| tech.meta_description |
<meta name=description> present |
—
|
| tech.mobile_friendly |
Mobile rendering: viewport + no fixed widths |
—
|
| tech.no_interstitials |
No intrusive mobile interstitials |
—
|
| tech.noindex_check |
Indexing not blocked by robots / X-Robots-Tag |
—
|
| tech.og_tags |
Open Graph tags present |
—
|
| tech.pagination_handled |
Pagination uses self-canonical, no rel=next/prev |
—
|
| tech.redirect_chains |
<=1 redirect to reach homepage |
—
|
| tech.render_blocking_css |
<=2 blocking stylesheets in <head> |
—
|
| tech.render_blocking_js |
No render-blocking <script> in <head> |
—
|
| tech.robots_present |
robots.txt reachable |
—
|
| tech.robots_valid |
robots.txt syntactically valid |
—
|
| tech.schema_org |
schema.org JSON-LD present |
—
|
| tech.schema_org_type |
schema.org primary type valid |
—
|
| tech.sitemap |
sitemap.xml reachable |
—
|
| tech.sitemap_in_robots |
Sitemap URL declared in robots.txt |
—
|
| tech.title_length |
<title> 50-60 chars (SERP sweet spot) |
—
|
| tech.ttfb_real |
Server response time (TTFB) <=800ms |
—
|
| tech.url_structure |
URL lowercase, hyphens, short, no special chars |
—
|
| tech.viewport_strict |
Viewport meta strict (no user-scalable=no) |
—
|
|
AEO (answer-engine readiness)
|
| aeo.about_page |
/about page with Organization schema |
—
|
| aeo.answer_conciseness |
>=1 paragraph in the 40-60 word snippet range |
—
|
| aeo.article_schema |
Article / BlogPosting schema with author + datePublished |
—
|
| aeo.author_entity |
Author / Organisation identified (schema or byline) |
—
|
| aeo.breadcrumb_schema |
BreadcrumbList schema for site hierarchy |
—
|
| aeo.content_freshness |
dateModified or visible 'Last updated' label |
—
|
| aeo.conversational_phrasing |
Second-person / conversational language present |
—
|
| aeo.definition_blocks |
Definition blocks (<dfn> or 'X is ...') in early content |
—
|
| aeo.direct_answer |
Opening 100 words contain a direct answer |
—
|
| aeo.external_authority_links |
Outbound links to authoritative sources |
—
|
| aeo.heading_hierarchy |
Single H1; no skipped heading levels (H1->H2->H3) |
—
|
| aeo.howto_schema |
HowTo schema present for step-by-step content |
—
|
| aeo.meta_tags |
Title / description / canonical / OG / lang / viewport |
—
|
| aeo.qa_headings |
H2/H3 headings phrased as questions (>=3) |
—
|
| aeo.schema_markup |
schema.org JSON-LD: Organization + FAQPage + Service |
—
|
| aeo.schema_validity |
JSON-LD blocks parse without errors |
—
|
| aeo.speakable_schema |
Speakable schema for voice-engine extraction |
—
|
|
GEO (generative-engine readiness)
|
| geo.ai_crawlers_allowed |
AI crawlers (GPTBot / ClaudeBot / etc.) not blocked |
—
|
| geo.author_credentials |
Author credentials explicit (role / years / cert) |
—
|
| geo.consistent_brand_name |
Brand name consistent: title / H1 / schema |
—
|
| geo.llms_txt |
/llms.txt present (llmstxt.org convention) |
—
|
| geo.named_sources |
Named external sources / citations |
—
|
| geo.no_hidden_content |
Key content not behind accordions / tabs |
—
|
| geo.no_js_required |
Core content in raw HTML (no JS required) |
—
|
| geo.original_data |
Original data / statistics present |
—
|
| geo.paragraph_length |
Paragraphs 40-80 words (no >120) |
—
|
| geo.prose_list_balance |
Lists <=60% of total content |
—
|
| geo.quotable_summary |
Quotable summary block (50-100 words near top) |
—
|
| geo.sameas_profiles |
Organization schema sameAs links (>=2) |
—
|
| geo.section_summaries |
H2 sections end with a tight summary (long pages) |
—
|
| geo.sitemap_freshness |
Sitemap <lastmod> within 90 days |
—
|
| geo.specific_statistics |
Specific numbers vs vague qualifiers |
—
|
| geo.topic_sentences |
Paragraph openers are direct topic statements |
—
|
|
WCAG accessibility
|
| acc.accessible_auth |
Accessible authentication (WCAG 3.3.8 A - added in 2.2) |
—
|
| acc.aria_landmarks |
ARIA landmark regions (WCAG 1.3.6 AAA) |
—
|
| acc.aria_validity |
ARIA attribute validity (WCAG 4.1.2 A) |
—
|
| acc.colour_contrast |
Colour contrast - inline (WCAG 1.4.3 AA) |
—
|
| acc.findable_help |
Findable help (WCAG 3.2.6 A - added in 2.2) |
—
|
| acc.focus_indicator |
Focus indicator (WCAG 2.4.7 AA) |
—
|
| acc.form_labels |
Form label associations (WCAG 1.3.1, 3.3.2 A) |
—
|
| acc.heading_hierarchy |
Heading hierarchy (WCAG 1.3.1, 2.4.6 A/AA) |
—
|
| acc.img_alt |
Image alt text (WCAG 1.1.1 A) |
—
|
| acc.interactive_semantics |
Interactive element semantics (WCAG 4.1.2 A) |
—
|
| acc.lang_declaration |
Language declaration (WCAG 3.1.1 A) |
—
|
| acc.media_transcripts |
Media captions & transcripts (WCAG 1.2.2, 1.2.3 A) |
—
|
| acc.semantic_structure |
Semantic HTML structure (WCAG 1.3.1 A) |
—
|
| acc.skip_nav |
Skip navigation link (WCAG 2.4.1 A) |
—
|
| acc.table_headers |
Table header cells (WCAG 1.3.1 A) |
—
|
| acc.target_size_aa |
Target size - inline (WCAG 2.5.8 AA - added in 2.2) |
—
|
| acc.touch_targets |
Touch target size - inline (WCAG 2.5.5 AAA) |
—
|
| acc.viewport_meta |
Viewport configuration (WCAG 1.4.4 AA) |
—
|