{"url":"https://lootsa.ee/","date":"2026-08-24","siteName":"Lõõtsa Ärikvartal","overall":78,"reasoning":"Performance is excellent (PSI Mobile 94, LCP 2.3 s, TTFB 6 ms), which anchors the score high. However, Security Headers are completely missing (0/100) and the site has User-Generated Content (textarea/upload), creating a high-risk XSS surface that demands Priority 1 remediation. Accessibility has a critical axe violation (button-name) and serious issues (contrast, link-name) that lower the score despite a 91 PSI accessibility rating. W3C validation shows 15 errors, primarily invalid script types and hidden input attributes, indicating technical debt. Missing meta descriptions and Open Graph tags further reduce SEO readiness.","confidence":"high","fixes":[{"priority":1,"category":"Security","title":"Implement HSTS and Content Security Policy (CSP)","impact":"Transport security, XSS mitigation","problem":"Security Headers grade is 0/100; HSTS and CSP are missing. Site signals indicate User-Generated Content (textarea, upload link), making XSS a Priority 1 risk per the rubric.","solution":"Add the following headers to your server configuration (e.g., Apache/Nginx):\n```apache\nHeader always set Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\"\nHeader always set Content-Security-Policy \"default-src 'self'; script-src 'nonce-{random}' 'strict-dynamic'; object-src 'none'; base-uri 'none';\"\nHeader always set X-Content-Type-Options \"nosniff\"\nHeader always set X-Frame-Options \"SAMEORIGIN\"\n```"},{"priority":1,"category":"Accessibility","title":"Fix critical button and link accessibility issues","impact":"WCAG 2.1 A compliance, screen reader usability","problem":"axe-core reports 1 critical violation (button-name) and 2 serious violations (color-contrast, link-name). Buttons lack discernible text and links in the gallery slider are unnamed.","solution":"- Add `aria-label` or visible text to all buttons (e.g., `<button aria-label=\"Play gallery\">`).\n- Ensure `.tag--brand` meets 4.5:1 contrast ratio.\n- Add `aria-label` to gallery links: `<a class=\"image__link\" aria-label=\"View image 1\" ...>`."},{"priority":2,"category":"Performance","title":"Remove lazy loading from hero image","impact":"LCP, First Contentful Paint","problem":"Optimization Checklist flags the hero image (`lootsa_hero-320x180.jpg`) as having `loading=\"lazy\"`, which delays LCP. Lighthouse LCP element is currently unavailable due to this.","solution":"Update the hero `<img>` tag to remove `loading=\"lazy\"` and add `fetchpriority=\"high\"`:\n```html\n<img src=\"/wp-content/uploads/.../lootsa_hero-320x180.jpg\" fetchpriority=\"high\" alt=\"...\" width=\"...\" height=\"...\">\n```"},{"priority":2,"category":"Best Practices","title":"Fix W3C HTML validation errors","impact":"Code quality, browser parsing consistency","problem":"15 validation errors found, including 11 instances of `<script type=\"text/rocketlazyloadscript\" defer>` (invalid type + defer combo) and hidden inputs with `autocomplete=\"off\"`.","solution":"- Remove `defer` from non-JavaScript script types (e.g., `text/rocketlazyloadscript`).\n- Remove `autocomplete` attribute from `<input type=\"hidden\">` elements.\n- Move `<meta charset>` to the first 1024 bytes of the document."},{"priority":3,"category":"SEO","title":"Add meta description and Open Graph tags","impact":"Search snippet quality, social sharing","problem":"HTML Inventory shows no meta description and 0 Open Graph/Twitter tags. PSI SEO audit flags `metaDescription` as failing.","solution":"Add to `<head>`:\n```html\n<meta name=\"description\" content=\"Lõõtsa Ärikvartal - Modern office spaces in Tallinn with green energy and flexible layouts.\">\n<meta property=\"og:title\" content=\"Lõõtsa Ärikvartal\">\n<meta property=\"og:image\" content=\"/path/to/og-image.jpg\">\n```"}],"coverage":{"pct":100,"missing":[]},"siteSummary":{"pagesAudited":1,"pagesAttempted":1,"urls":["https://lootsa.ee/"]},"psiSnapshot":{"rows":[{"pageUrl":null,"perfMobile":94,"perfDesktop":100,"lcpMobileMs":2289,"lcpDesktopMs":684,"clsMobile":0,"clsDesktop":0.028078718763271938}]},"optimizationChecklist":{"items":[{"id":"caching","title":"Page caching plugin / CDN active","status":"pass","detail":"Caching plugin detected (WP Rocket)","evidence":["HTML markers: WP Rocket","generator: WP Rocket 3.23.2.1"]},{"id":"lazyload","title":"Images lazy-loaded","status":"pass","detail":"All non-hero raster images use loading=\"lazy\".","evidence":[]},{"id":"heroEager","title":"Hero image eagerly loaded","status":"fail","detail":"Hero image has loading=\"lazy\", which delays LCP (inferred from DOM order/size — Lighthouse LCP element unavailable). Use loading=\"eager\" (or omit loading) and add fetchpriority=\"high\".","evidence":["hero: https://lootsa.ee/wp-content/uploads/2026/08/lootsa_hero-320x180.jpg","loading: lazy","fetchpriority: (not set)"]},{"id":"heroBackground","title":"Hero is a real <img> (not a CSS background-image)","status":"n/a","detail":"No CSS background-images detected on raster-image-eligible elements.","evidence":[]},{"id":"responsive","title":"Responsive images (srcset / <picture>)","status":"pass","detail":"36/43 raster images use srcset or <picture> (84%).","evidence":["…a.ee/wp-content/themes/lootsa-arikvartal/inc/theme/img/lootsa4-plaan.jpg?v=59","…ee/wp-content/themes/lootsa-arikvartal/inc/theme/img/lootsa5-korrus1.jpg?v=59","…ee/wp-content/themes/lootsa-arikvartal/inc/theme/img/lootsa5-korrus2.jpg?v=59","…ee/wp-content/themes/lootsa-arikvartal/inc/theme/img/lootsa5-korrus3.jpg?v=59","…ee/wp-content/themes/lootsa-arikvartal/inc/theme/img/lootsa6-korrus1.jpg?v=59"]},{"id":"imageSizes","title":"Reasonable number of image sizes","status":"pass","detail":"33 distinct srcset widths.","evidence":["widths: 233, 276, 278, 280, 300, 320, 360, 420, 465, 498, 533, 551, 555, 560, 640, 720, 768, 840, 841, 996, 1003, 1024, 1066, 1080, 1360, 1536, 1600, 1920, 2048, 2161, 2162, 2560, 3200"]},{"id":"scriptsFooter","title":"JS scripts not blocking in <head>","status":"pass","detail":"No render-blocking scripts in <head>.","evidence":[]}],"summary":{"passed":5,"warned":0,"failed":1,"notApplicable":1},"priorities":[{"title":"Hero image eagerly loaded","severity":"high","detail":"Hero image has loading=\"lazy\", which delays LCP (inferred from DOM order/size — Lighthouse LCP element unavailable). Use loading=\"eager\" (or omit loading) and add fetchpriority=\"high\"."}]},"perPageOverall":[{"url":"https://lootsa.ee/","overall":78,"reasoning":"Performance is excellent (PSI Mobile 94, LCP 2.3 s, TTFB 6 ms), which anchors the score high. However, Security Headers are completely missing (0/100) and the site has User-Generated Content (textarea/upload), creating a high-risk XSS surface that demands Priority 1 remediation. Accessibility has a critical axe violation (button-name) and serious issues (contrast, link-name) that lower the score despite a 91 PSI accessibility rating. W3C validation shows 15 errors, primarily invalid script types and hidden input attributes, indicating technical debt. Missing meta descriptions and Open Graph tags further reduce SEO readiness.","confidence":"high","fixes":[{"priority":1,"category":"Security","title":"Implement HSTS and Content Security Policy (CSP)","impact":"Transport security, XSS mitigation","problem":"Security Headers grade is 0/100; HSTS and CSP are missing. Site signals indicate User-Generated Content (textarea, upload link), making XSS a Priority 1 risk per the rubric.","solution":"Add the following headers to your server configuration (e.g., Apache/Nginx):\n```apache\nHeader always set Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\"\nHeader always set Content-Security-Policy \"default-src 'self'; script-src 'nonce-{random}' 'strict-dynamic'; object-src 'none'; base-uri 'none';\"\nHeader always set X-Content-Type-Options \"nosniff\"\nHeader always set X-Frame-Options \"SAMEORIGIN\"\n```"},{"priority":1,"category":"Accessibility","title":"Fix critical button and link accessibility issues","impact":"WCAG 2.1 A compliance, screen reader usability","problem":"axe-core reports 1 critical violation (button-name) and 2 serious violations (color-contrast, link-name). Buttons lack discernible text and links in the gallery slider are unnamed.","solution":"- Add `aria-label` or visible text to all buttons (e.g., `<button aria-label=\"Play gallery\">`).\n- Ensure `.tag--brand` meets 4.5:1 contrast ratio.\n- Add `aria-label` to gallery links: `<a class=\"image__link\" aria-label=\"View image 1\" ...>`."},{"priority":2,"category":"Performance","title":"Remove lazy loading from hero image","impact":"LCP, First Contentful Paint","problem":"Optimization Checklist flags the hero image (`lootsa_hero-320x180.jpg`) as having `loading=\"lazy\"`, which delays LCP. Lighthouse LCP element is currently unavailable due to this.","solution":"Update the hero `<img>` tag to remove `loading=\"lazy\"` and add `fetchpriority=\"high\"`:\n```html\n<img src=\"/wp-content/uploads/.../lootsa_hero-320x180.jpg\" fetchpriority=\"high\" alt=\"...\" width=\"...\" height=\"...\">\n```"},{"priority":2,"category":"Best Practices","title":"Fix W3C HTML validation errors","impact":"Code quality, browser parsing consistency","problem":"15 validation errors found, including 11 instances of `<script type=\"text/rocketlazyloadscript\" defer>` (invalid type + defer combo) and hidden inputs with `autocomplete=\"off\"`.","solution":"- Remove `defer` from non-JavaScript script types (e.g., `text/rocketlazyloadscript`).\n- Remove `autocomplete` attribute from `<input type=\"hidden\">` elements.\n- Move `<meta charset>` to the first 1024 bytes of the document."},{"priority":3,"category":"SEO","title":"Add meta description and Open Graph tags","impact":"Search snippet quality, social sharing","problem":"HTML Inventory shows no meta description and 0 Open Graph/Twitter tags. PSI SEO audit flags `metaDescription` as failing.","solution":"Add to `<head>`:\n```html\n<meta name=\"description\" content=\"Lõõtsa Ärikvartal - Modern office spaces in Tallinn with green energy and flexible layouts.\">\n<meta property=\"og:title\" content=\"Lõõtsa Ärikvartal\">\n<meta property=\"og:image\" content=\"/path/to/og-image.jpg\">\n```"}],"perfScore":94,"a11yScore":91,"bestPracticesScore":100,"seoScore":92,"securityScore":0}]}