About
GSC Readiness is a free auditor. You paste a URL, we run it against the things Google Search Central documentation tells you to do, and you get a graded report.
What it checks
The audit runs 55 Google-documented rules across 10 categories, plus 20 unscored advisories. Every rule below cites the exact Google page it encodes and the date that page was last read against the rule's logic (latest: 2026-09-07).
- Indexing & crawl — Served over HTTPS, Page returns HTTP 200, Content-Type is an indexable HTML type, Redirect chain length, Redirect lands on a different host, robots.txt present, robots.txt allows Googlebot to crawl this URL, Sitemap declared in robots.txt, Google-Extended (AI training) robots handling, XML sitemap discovered, Sitemap provides <lastmod>, Sitemap URLs are fully qualified, No noindex directive, Canonical declared, Canonical is an absolute URL, Canonical points to this URL, Links are crawlable <a href>.
- Page metadata — <title> present, <title> length, Meta description present, Meta description length, Primary heading (<h1>), Section headings (<h2>), Favicon declared, Favicon fetchable by Googlebot-Image, Favicon is square and at least 48×48, Snippet / AI-feature controls, Character encoding declared.
- Images — Preferred image declared (og:image / primaryImageOfPage), Images have alt text, Hero images not lazy-loaded, Images use <img>, not CSS backgrounds.
- Structured data — JSON-LD structured data present, JSON-LD parses as valid JSON, Organization or WebSite entity declared, Organization has name, url, logo, WebSite has name and url, Article has headline, image, datePublished, author, Product has name and offers/review/rating, BreadcrumbList, ProfilePage has mainEntity with name, VideoObject has name, thumbnailUrl, uploadDate, Structured data matches visible content.
- International — hreflang annotations, hreflang x-default, hreflang set includes this page, hreflang URLs are fully qualified.
- Mobile — Viewport meta configured, apple-touch-icon, theme-color meta, Web app manifest.
- HTTPS & headers — No mixed content, HSTS (Strict-Transport-Security), X-Content-Type-Options: nosniff, Clickjacking protection (X-Frame-Options / frame-ancestors), Content-Security-Policy, Referrer-Policy, Permissions-Policy.
- Core Web Vitals — LCP (Largest Contentful Paint), INP (Interaction to Next Paint), CLS (Cumulative Layout Shift), CrUX field data availability, PageSpeed Insights API, Time to first byte, Lighthouse Performance, Lighthouse Accessibility, Lighthouse Best Practices.
- Spam-policy hygiene — No meta-refresh redirect, No hidden text or links, No back-button hijacking.
- Open Graph & X cards — Open Graph core tags, og:image:width / og:image:height, og:image:alt, X (Twitter) Card core tags, twitter:image:alt.
How scoring works
Each check returns pass / warn / fail, or info for observations that carry no judgement. Only rules that are Google-documented and active count: pass = 1, warn = 0.5, fail = 0, averaged into a 0–100 score. Letter grade is A (≥90), B (≥80), C (≥70), D (≥60), F otherwise.
- Beyond Google — security headers, X cards, PWA extras, Lighthouse lab scores. Reported, never scored. A category with nothing scored shows no score instead of a misleading 0 or 100.
- Deprecated — features Google has retired (FAQ rich results, HowTo, the sitelinks search box, AMP). Their markup is harmless; we report it as info and never reward or penalise it.
- Info — things like "no CrUX field data" or "no hreflang on a single-language site" that are not defects.
How it stays current
Google changes its documentation most weeks. Every Monday a job re-fetches each Google page cited
below, compares it with the copy it hashed the week before, and reads the
Search Central changelog.
Any rule whose source changed, moved or disappeared is marked under review
here and on scan results, and a reviewer re-reads the page and proposes the rule change as a pull request.
Nothing changes in the audit until a human merges it. The catalog and current flags are also available as JSON at
/gscreadiness/api/rules.
Rule catalog
Indexing & crawl
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
Served over HTTPSidx.https 2026.09.0: source moved from the retired /advanced/security/https page (now on web.dev) to the page-experience doc, which lists secure serving. | Google, scored | active | developers.google.com/appearance/page-experience2026-09-07 |
Page returns HTTP 200idx.http.status 2026.09.0: source moved to the Google Crawling site (2025-11). Google only indexes pages served with 200. | Google, scored | active | developers.google.com/crawling/docs/troubleshooting/http-status-codes2026-09-07 |
Content-Type is an indexable HTML typeidx.http.content-type 2026.09.0: new rule: Google indexes only supported file types; HTML pages must be served as text/html or application/xhtml+xml. | Google, scored | active | developers.google.com/crawling-indexing/indexable-file-types2026-09-07 |
Redirect chain lengthidx.redirect.chain 2026.09.0: unchanged thresholds (0–1 pass, 2–3 warn, 4+ fail). Google recommends server-side 301/308 and follows a limited number of hops. | Google, scored | active | developers.google.com/crawling-indexing/301-redirects2026-09-07 |
Redirect lands on a different hostidx.redirect.cross-host 2026.09.0: new informational rule: a cross-host redirect means the audited URL is not the canonical host; robots.txt and sitemap are read from the requested host. | Google, scored | active | developers.google.com/crawling-indexing/301-redirects2026-09-07 |
robots.txt presentidx.robots.present 2026.09.0: absence downgraded from warn to info: Google treats a missing robots.txt as allow-all. | Google, scored | active | developers.google.com/crawling-indexing/robots/intro2026-09-07 |
robots.txt allows Googlebot to crawl this URLidx.robots.googlebot-allowed 2026.09.0: parser rewritten to honour * and $ wildcards, case-insensitive product tokens, longest match with least-restrictive tie-break, and groups not split by blank lines (RFC 9309 as Google interprets it). | Google, scored | active | developers.google.com/crawling/docs/robots-txt/robots-txt-spec2026-09-07 |
Sitemap declared in robots.txtidx.robots.sitemap-directive 2026.09.0: warn only when no sitemap was discovered by any route; info when found at a conventional path without a directive. | Google, scored | active | developers.google.com/crawling-indexing/sitemaps/build-sitemap2026-09-07 |
Google-Extended (AI training) robots handlingidx.robots.google-extended 2026.09.0: new informational rule: reports whether Google-Extended is blocked. It controls Gemini/Vertex training use only and has no effect on Search or AI Overviews. | Google, scored | active | developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers2026-09-07 |
XML sitemap discoveredidx.sitemap.discovered 2026.09.0: discovery now follows robots.txt Sitemap: directives, then /sitemap.xml, then /sitemap_index.xml. Absence downgraded from fail to warn (sitemaps are recommended, not required). | Google, scored | active | developers.google.com/crawling-indexing/sitemaps/build-sitemap2026-09-07 |
Sitemap provides <lastmod>idx.sitemap.lastmod 2026.09.0: unchanged: Google uses lastmod when consistently accurate; priority and changefreq are ignored. | Google, scored | active | developers.google.com/crawling-indexing/sitemaps/build-sitemap2026-09-07 |
Sitemap URLs are fully qualifiedidx.sitemap.absolute-urls 2026.09.0: new rule: Google requires absolute URLs in <loc>. | Google, scored | active | developers.google.com/crawling-indexing/sitemaps/build-sitemap2026-09-07 |
No noindex directiveidx.noindex 2026.09.0: now reads <meta name="robots">, <meta name="googlebot"> anywhere in the document (Google honours body placement, changelog 2026-03-24), and the X-Robots-Tag header; noindex and none both count. | Google, scored | active | developers.google.com/crawling-indexing/block-indexing2026-09-07 |
Canonical declaredidx.canonical.present 2026.09.0: also accepts the HTTP Link: rel="canonical" header. Absence downgraded to warn: Google picks a canonical itself when none is declared. | Google, scored | active | developers.google.com/crawling-indexing/canonicalization2026-09-07 |
Canonical is an absolute URLidx.canonical.absolute 2026.09.0: new rule: Google recommends absolute canonical URLs. | Google, scored | active | developers.google.com/crawling-indexing/canonicalization2026-09-07 |
Canonical points to this URLidx.canonical.self 2026.09.0: split from the old combined canonical check; a canonical pointing elsewhere is a warn with the target shown. | Google, scored | active | developers.google.com/crawling-indexing/canonicalization2026-09-07 |
Links are crawlable <a href>idx.links.crawlable 2026.09.0: new rule: Google only follows <a> elements with an href that resolves to a URL, not javascript: or click handlers. | Google, scored | active | developers.google.com/crawling-indexing/links-crawlable2026-09-07 |
lang attribute on <html>idx.html-lang 2026.09.0: retired: Google states it does not use the lang attribute and detects language from content. Was a hard fail. | Google, scored | retired | developers.google.com/crawling-indexing/special-tags2026-09-07 |
Page metadata
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
<title> presentmeta.title 2026.09.0: merged the old "Title tag" / "Title tag present" rows into one. | Google, scored | active | developers.google.com/appearance/title-link2026-09-07 |
<title> lengthmeta.title.length 2026.09.0: warn-only heuristic (15–65 chars). Google publishes no character limit; it rewrites titles that are too long, generic or stuffed. | Google, scored | active | developers.google.com/appearance/title-link2026-09-07 |
Meta description presentmeta.description 2026.09.0: merged the old "Meta description" / "Meta description present" rows into one. | Google, scored | active | developers.google.com/appearance/snippet2026-09-07 |
Meta description lengthmeta.description.length 2026.09.0: warn-only heuristic (50–165 chars). Google states there is no fixed length; snippets are generated from page content when the description is unhelpful. | Google, scored | active | developers.google.com/appearance/snippet2026-09-07 |
Primary heading (<h1>)meta.h1 2026.09.0: missing h1 downgraded from fail to warn: the SEO starter guide recommends meaningful headings but Google has no h1 requirement. | Google, scored | active | developers.google.com/fundamentals/seo-starter-guide2026-09-07 |
Section headings (<h2>)meta.h2-count 2026.09.0: moved to advisory: heading structure helps readers; Google documents no h2 requirement. | Beyond Google | active | developers.google.com/fundamentals/seo-starter-guide2026-09-07 |
Favicon declaredmeta.favicon.link 2026.09.0: rel list now includes apple-touch-icon-precomposed; a /favicon.ico fallback counts as declared. | Google, scored | active | developers.google.com/appearance/favicon-in-search2026-09-07 |
Favicon fetchable by Googlebot-Imagemeta.favicon.fetchable 2026.09.0: new rule: the icon must return 200 with an image type and must not be blocked for Googlebot-Image or Googlebot. | Google, scored | active | developers.google.com/appearance/favicon-in-search2026-09-07 |
Favicon is square and at least 48×48meta.favicon.size 2026.09.0: new rule: 1:1 aspect ratio required; larger than 48×48 recommended; SVG accepted (formats listed 2026-08-28). | Google, scored | active | developers.google.com/appearance/favicon-in-search2026-09-07 |
Snippet / AI-feature controlsmeta.snippet.controls 2026.09.0: new informational rule: nosnippet, max-snippet:0 and data-nosnippet also remove the page from AI Overviews and AI Mode. | Google, scored | active | developers.google.com/crawling-indexing/robots-meta-tag2026-09-07 |
Character encoding declaredmeta.charset 2026.09.0: new rule: Google reads charset from <meta charset>, http-equiv Content-Type, or the Content-Type header. | Google, scored | active | developers.google.com/crawling-indexing/special-tags2026-09-07 |
Images
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
Preferred image declared (og:image / primaryImageOfPage)img.preferred 2026.09.0: new rule from the 2026-03-02 "preferred image" section: Google reads og:image or schema.org primaryImageOfPage to pick the representative image. | Google, scored | active | developers.google.com/appearance/google-images2026-09-07 |
Images have alt textimg.alt-coverage 2026.09.0: new rule: alt text is "the most important attribute" for image metadata; ≥90% coverage passes. | Google, scored | active | developers.google.com/appearance/google-images2026-09-07 |
Hero images not lazy-loadedimg.lazy-above-fold 2026.09.0: new low-confidence rule: primary content should not require interaction or lazy-loading to render. | Google, scored | active | developers.google.com/crawling-indexing/javascript/lazy-loading2026-09-07 |
Images use <img>, not CSS backgroundsimg.uses-img-element 2026.09.0: new informational rule: Google discovers images through <img>/<picture>, not CSS background-image. | Google, scored | active | developers.google.com/appearance/google-images2026-09-07 |
Structured data
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
JSON-LD structured data presentsd.jsonld.present 2026.09.0: absence downgraded from fail to warn: structured data is recommended for rich results, not required for indexing. | Google, scored | active | developers.google.com/appearance/structured-data/intro-structured-data2026-09-07 |
JSON-LD parses as valid JSONsd.jsonld.valid 2026.09.0: source changed: the troubleshooting-structured-data page no longer exists. | Google, scored | active | developers.google.com/appearance/structured-data/intro-structured-data2026-09-07 |
Organization or WebSite entity declaredsd.site-entity 2026.09.0: absence downgraded to warn; source moved from the retired logo page to the Organization page. | Google, scored | active | developers.google.com/appearance/structured-data/organization2026-09-07 |
Organization has name, url, logosd.organization.props 2026.09.0: new rule: logo must be ≥112×112 and crawlable; sameAs recommended. | Google, scored | active | developers.google.com/appearance/structured-data/organization2026-09-07 |
WebSite has name and urlsd.website.props 2026.09.0: new rule: WebSite name/url drive the site name shown in results. | Google, scored | active | developers.google.com/appearance/site-names2026-09-07 |
Article has headline, image, datePublished, authorsd.article.props 2026.09.0: new rule covering Article, BlogPosting, NewsArticle, TechArticle. | Google, scored | active | developers.google.com/appearance/structured-data/article2026-09-07 |
Product has name and offers/review/ratingsd.product.props 2026.09.0: new rule: product snippets need at least one of offers, review, aggregateRating. | Google, scored | active | developers.google.com/appearance/structured-data/product2026-09-07 |
BreadcrumbListsd.breadcrumb 2026.09.0: absence downgraded to info; when present, itemListElement entries are validated (name on all, item on all but last). Breadcrumb display is desktop-only since 2025-01. | Google, scored | active | developers.google.com/appearance/structured-data/breadcrumb2026-09-07 |
ProfilePage has mainEntity with namesd.profilepage.props 2026.09.0: new rule. | Google, scored | active | developers.google.com/appearance/structured-data/profile-page2026-09-07 |
VideoObject has name, thumbnailUrl, uploadDatesd.videoobject.props 2026.09.0: new rule. | Google, scored | active | developers.google.com/appearance/structured-data/video2026-09-07 |
Structured data matches visible contentsd.type-page-consistency 2026.09.0: new low-confidence rule: Article markup on a page with almost no visible text violates the "content must be visible" policy. | Google, scored | active | developers.google.com/appearance/structured-data/sd-policies2026-09-07 |
Sitelinks search box (SearchAction)sd.searchaction 2026.09.0: deprecated: Google retired the sitelinks search box on 2024-11-21. Previously every site without SearchAction got a warn. | Google, scored | deprecated | developers.google.com/search/updates2026-09-07 |
FAQPage structured datasd.faqpage 2026.09.0: deprecated: FAQ rich results stopped appearing on 2026-05-07; Search Console and Rich Results Test support ended 2026-06. | Google, scored | deprecated | developers.google.com/search/updates2026-09-07 |
HowTo structured datasd.howto 2026.09.0: deprecated: How-to rich results were removed in 2023. | Google, scored | deprecated | developers.google.com/search/updates2026-09-07 |
Other retired structured data typessd.retired-types 2026.09.0: reports ClaimReview, SpecialAnnouncement, Vehicle listing, practice-problem (Quiz) markup as informational; support was removed 2025–2026. | Google, scored | deprecated | developers.google.com/search/updates2026-09-07 |
Content-specific schema in usesd.content-type.any 2026.09.0: retired: replaced by per-type validators (Article, Product, Breadcrumb, ProfilePage, VideoObject). | Google, scored | retired | developers.google.com/appearance/structured-data/search-gallery2026-09-07 |
International
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
hreflang annotationsintl.hreflang.present 2026.09.0: absence is now info (not a 50% category): hreflang is only needed for localized variants. | Google, scored | active | developers.google.com/specialty/international/localized-versions2026-09-07 |
hreflang x-defaultintl.hreflang.x-default 2026.09.0: unchanged: x-default recommended for the unmatched-language fallback. | Google, scored | active | developers.google.com/specialty/international/localized-versions2026-09-07 |
hreflang set includes this pageintl.hreflang.self 2026.09.0: unchanged: every language version must list itself and all other versions. | Google, scored | active | developers.google.com/specialty/international/localized-versions2026-09-07 |
hreflang URLs are fully qualifiedintl.hreflang.absolute 2026.09.0: new rule: Google requires fully-qualified URLs including transport method. | Google, scored | active | developers.google.com/specialty/international/localized-versions2026-09-07 |
Mobile
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
Viewport meta configuredmobile.viewport 2026.09.0: now the single viewport check (was duplicated in metadata). Mobile-first indexing is complete for all sites; a page that does not render on mobile is not indexed. | Google, scored | active | developers.google.com/crawling-indexing/mobile/mobile-sites-mobile-first-indexing2026-09-07 |
AMP variantmobile.amp 2026.09.0: deprecated: AMP has not been required for any Search feature since 2021; the old check penalised every non-AMP site. Now info only when an amphtml link is present. | Google, scored | deprecated | developers.google.com/crawling-indexing/amp2026-09-07 |
apple-touch-iconmobile.apple-touch-icon 2026.09.0: moved to advisory: iOS home-screen UX, not a Google signal. | Beyond Google | active | developer.mozilla.org/HTML/Reference/Attributes/rel2026-09-07 |
theme-color metamobile.theme-color 2026.09.0: moved to advisory: browser chrome colour, not a Google signal. | Beyond Google | active | developer.mozilla.org/HTML/Reference/Elements/meta/name/theme-color2026-09-07 |
Web app manifestmobile.manifest 2026.09.0: moved to advisory: PWA installability, not a Google signal (Lighthouse dropped its PWA category in v12). | Beyond Google | active | developer.mozilla.org/Progressive_web_apps/Manifest2026-09-07 |
HTTPS & headers
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
No mixed contentsec.mixed-content 2026.09.0: unchanged logic; source now the page-experience doc (secure serving). | Google, scored | active | developers.google.com/appearance/page-experience2026-09-07 |
HSTS (Strict-Transport-Security)sec.hsts 2026.09.0: moved to advisory: not documented by Google as a Search signal (was a hard fail). | Beyond Google | active | developer.mozilla.org/HTTP/Reference/Headers/Strict-Transport-Security2026-09-07 |
X-Content-Type-Options: nosniffsec.nosniff 2026.09.0: moved to advisory: not a Google signal (was a hard fail). | Beyond Google | active | developer.mozilla.org/HTTP/Reference/Headers/X-Content-Type-Options2026-09-07 |
Clickjacking protection (X-Frame-Options / frame-ancestors)sec.clickjacking 2026.09.0: moved to advisory: not a Google signal (was a hard fail). | Beyond Google | active | developer.mozilla.org/HTTP/Reference/Headers/Content-Security-Policy/frame-ancestors2026-09-07 |
Content-Security-Policysec.csp 2026.09.0: moved to advisory. | Beyond Google | active | developer.mozilla.org/HTTP/Reference/Headers/Content-Security-Policy2026-09-07 |
Referrer-Policysec.referrer-policy 2026.09.0: moved to advisory. | Beyond Google | active | developer.mozilla.org/HTTP/Reference/Headers/Referrer-Policy2026-09-07 |
Permissions-Policysec.permissions-policy 2026.09.0: moved to advisory. | Beyond Google | active | developer.mozilla.org/HTTP/Reference/Headers/Permissions-Policy2026-09-07 |
Core Web Vitals
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
LCP (Largest Contentful Paint)cwv.lcp 2026.09.0: unchanged: good ≤2.5s, poor >4s at p75 of CrUX field data. | Google, scored | active | developers.google.com/appearance/core-web-vitals2026-09-07 |
INP (Interaction to Next Paint)cwv.inp 2026.09.0: unchanged: good ≤200ms, poor >500ms. INP replaced FID in 2024. | Google, scored | active | developers.google.com/appearance/core-web-vitals2026-09-07 |
CLS (Cumulative Layout Shift)cwv.cls 2026.09.0: unchanged: good ≤0.1, poor >0.25. | Google, scored | active | developers.google.com/appearance/core-web-vitals2026-09-07 |
CrUX field data availabilitycwv.field-data 2026.09.0: new informational rule replacing three "no CrUX field data" warns: lack of real-user data is not a defect. | Google, scored | active | developers.google.com/appearance/core-web-vitals2026-09-07 |
PageSpeed Insights APIcwv.psi-unavailable 2026.09.0: informational: surfaced only when PSI could not be queried. | Beyond Google | active | developers.google.com/speed/docs/insights/v5/get-started2026-09-07 |
Time to first byteperf.ttfb 2026.09.0: moved from indexing to a performance advisory: TTFB is a web.dev diagnostic, not a documented Google Search signal. | Beyond Google | active | web.dev/articles/ttfb2026-09-07 |
Lighthouse Performanceperf.lighthouse.performance 2026.09.0: moved to advisory: lab score, not the field data Google ranks on. | Beyond Google | active | developer.chrome.com/docs/lighthouse/overview2026-09-07 |
Lighthouse Accessibilityperf.lighthouse.accessibility 2026.09.0: moved to advisory. | Beyond Google | active | developer.chrome.com/docs/lighthouse/overview2026-09-07 |
Lighthouse Best Practicesperf.lighthouse.best-practices 2026.09.0: moved to advisory. | Beyond Google | active | developer.chrome.com/docs/lighthouse/overview2026-09-07 |
Lighthouse SEOperf.lighthouse.seo 2026.09.0: retired: double-counted checks this auditor already performs. | Beyond Google | retired | developer.chrome.com/docs/lighthouse/overview2026-09-07 |
Spam-policy hygiene
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
No meta-refresh redirectspam.meta-refresh 2026.09.0: new rule: instant meta refresh to another URL is a sneaky-redirect pattern; Google recommends server-side redirects. | Google, scored | active | developers.google.com/essentials/spam-policies2026-09-07 |
No hidden text or linksspam.hidden-text 2026.09.0: new low-confidence rule: large text/link blocks wrapped in display:none, opacity:0, font-size:0 or off-screen positioning. | Google, scored | active | developers.google.com/essentials/spam-policies2026-09-07 |
No back-button hijackingspam.pushstate-hijack 2026.09.0: new low-confidence rule: "back button hijacking" was added to the malicious-practices spam policy on 2026-04-13. | Google, scored | active | developers.google.com/essentials/spam-policies2026-09-07 |
Open Graph & X cards
| Rule | Tier | Status | Source · verified |
|---|---|---|---|
Open Graph core tagssocial.og.core 2026.09.0: moved to advisory (Google has no social-cards doc; the old docs link 404s). Matching now accepts name= or property= in any order. og:image itself is scored under img.preferred. | Beyond Google | active | ogp.me/2026-09-07 |
og:image:width / og:image:heightsocial.og.image-dimensions 2026.09.0: moved to advisory. | Beyond Google | active | ogp.me/2026-09-07 |
og:image:altsocial.og.image-alt 2026.09.0: moved to advisory. | Beyond Google | active | ogp.me/2026-09-07 |
X (Twitter) Card core tagssocial.twitter.core 2026.09.0: moved to advisory; X moved its Cards documentation to docs.x.com (the old developer.x.com deep link redirects). | Beyond Google | active | docs.x.com/2026-09-07 |
twitter:image:altsocial.twitter.image-alt 2026.09.0: moved to advisory. | Beyond Google | active | docs.x.com/2026-09-07 |
What it doesn't check
We're an external auditor. We can't see:
- Whether your site is actually verified in Search Console.
- Your impression / click data from GSC's Performance report.
- Manual actions, security issues, or coverage details GSC surfaces internally.
For that you need the real Search Console at search.google.com/search-console. This tool is the "would your site pass if you submitted it today" predictive layer.
Independent and free
GSC Readiness is built by Boringhaus, an independent digital media company that runs a portfolio of useful, boring web tools. No login, no email capture, no upsell tier. The codebase fork from AEORadar's scanner added the GSC-specific checks; the audit logic and methodology page are open if you want to inspect what we score.
Contact
Questions, scan-result bug reports, partnerships: team@boringhaus.com.