{
  "version": "0.1.0",
  "scanTitle": "SCAN: https://CivicActions.com",
  "issueNumber": 41,
  "generatedAt": "2026-04-20T17:39:16.737Z",
  "requestedUrls": [
    "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
    "https://civicactions.com/case-studies/fcc-website-modernization/",
    "https://civicactions.com/case-studies/georgia-workforce-open-data/",
    "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks/",
    "https://civicactions.com/case-studies/nsf-website-redesign/",
    "https://civicactions.com/case-studies/va-cms-modernization/",
    "https://civicactions.com/case-studies/open-acr/",
    "https://civicactions.com/case-studies/va-alt-text/",
    "https://civicactions.com/case-studies/Drupal-10/",
    "https://civicactions.com/case-studies/globalnet-platform-support/",
    "https://civicactions.com/case-studies/dept-of-education-system-lifecycle-development-management/",
    "https://civicactions.com/case-studies/cybergeek/",
    "https://civicactions.com/case-studies/cms-web-experience-services/",
    "https://civicactions.com/press/2024-07-09-CivicActions-Appoints-Mike-Gifford/",
    "https://civicactions.com/press/2024-01-16-CivicActions-Announces-Impact-Report/",
    "https://civicactions.com/press/2024-01-05-CivicActions-Partners-with-aamdsif/",
    "https://civicactions.com/press/2022-04-21-civicactions-announces-Ryerson-partnership-digital-accessibility/",
    "https://civicactions.com/press/2022-01-05-civicactions-named-govtech-100-top-government-technology-companies-list/",
    "https://civicactions.com/press/2021-09-08-civicactions-announces-ditap-grads-across-federal-agencies/",
    "https://civicactions.com/press/2021-07-19-civicactions-announces-va-ditap-graduation/",
    "https://civicactions.com/press/2021-07-08-gsa-engages-civicactions-to-modernize-vpat/",
    "https://civicactions.com/press/2021-05-11-civicactions-wins-department-of-ed-recompete/",
    "https://civicactions.com/press/2021-05-03-civicactions-wins-nsf-recompete/",
    "https://civicactions.com/press/2020-11-09-civicactions-acquires-openconcept/",
    "https://civicactions.com/press/2020-08-14-civicactions-certified-to-deliver-ditap/",
    "https://civicactions.com/press/2020-03-02-civicactions-wins-cms-contract/",
    "https://civicactions.com/press/",
    "https://civicactions.com/press/2/",
    "https://civicactions.com/press/3/",
    "https://civicactions.com/accessibility-statement/",
    "https://civicactions.com/services/ditap/",
    "https://civicactions.com/careers/",
    "https://civicactions.com/case-studies/",
    "https://civicactions.com/contact/",
    "https://civicactions.com/contracting/",
    "https://civicactions.com/feedback/",
    "https://civicactions.com/",
    "https://civicactions.com/licensing/",
    "https://civicactions.com/privacy/",
    "https://civicactions.com/services/",
    "https://civicactions.com/services2/",
    "https://civicactions.com/styles/",
    "https://civicactions.com/sustainability/",
    "https://civicactions.com/team/",
    "https://civicactions.com/services/ditap/register/",
    "https://civicactions.com/manifest.webmanifest",
    "https://civicactions.com/services/ditap",
    "https://civicactions.com/services/ditap/register",
    "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks%20/",
    "https://civicactions.com/case-studies/cms-web-experience-services/fearless.tech",
    "https://civicactions.com/feedback",
    "https://civicactions.com/case-studies",
    "https://civicactions.com/case-studies/va-cms-modernization",
    "https://civicactions.com/case-studies/Drupal-10/CMS.gov",
    "https://civicactions.com/case-studies/Drupal-10/Medicare.gov",
    "https://civicactions.com/case-studies/Drupal-10/Openpaymentsdata.cms.gov",
    "https://civicactions.com/case-studies/Drupal-10/Data.medicaid.gov",
    "https://civicactions.com/case-studies/Drupal-10/Data.healthcare.gov",
    "https://civicactions.com/case-studies/Drupal-10/SDIS.medicaid.gov",
    "https://civicactions.com/case-studies/Drupal-10/PFS.data.cms.gov",
    "https://civicactions.com/case-studies/Drupal-10/QIC.cms.gov",
    "https://civicactions.com/case-studies/cms-web-experience-services",
    "https://civicactions.com/case-studies/cms-design-challenge-mvp",
    "https://civicactions.com/case-studies/fearless.tech"
  ],
  "summary": {
    "okCount": 64,
    "errorCount": 0,
    "averagePerformanceScore": 0.6962499999999999,
    "averageBestPracticesScore": 0.7932812499999999,
    "totalTransferBytes": 165699282,
    "totalCo2Grams": 63.476312927554815,
    "averageTransferBytes": 2589051.28125,
    "averageCo2GramsPerPage": 0.991817389493044,
    "averageRedundancyScore": 9.984375,
    "highUrgencyRedundancyCount": 0,
    "averageModularizationScore": 31.59375,
    "highUrgencyModularizationCount": 20,
    "averageDeadCodeScore": 8.0625,
    "highUrgencyDeadCodeCount": 52,
    "averageNonCriticalResourcesScore": 10.640625,
    "highUrgencyNonCriticalResourcesCount": 20,
    "averageFormValidationScore": 4.8046875,
    "highUrgencyFormValidationCount": 2,
    "averageMetadataScore": 1.25,
    "highUrgencyMetadataCount": 1,
    "averageLayoutAdaptationScore": 30.15625,
    "highUrgencyLayoutAdaptationCount": 0,
    "averageSecurityLightScore": 51.390625,
    "highUrgencySecurityLightCount": 4,
    "averageDependencyMaintenanceScore": 2.34375,
    "highUrgencyDependencyMaintenanceCount": 0,
    "averageExpectedFilesScore": 40,
    "highUrgencyExpectedFilesCount": 0,
    "averageCompressionScore": 13.546875,
    "highUrgencyCompressionCount": 6,
    "averageOptimizationScore": 81.25,
    "highUrgencyOptimizationCount": 52,
    "averageOfflineSupportScore": 100,
    "highUrgencyOfflineSupportCount": 64,
    "averageLanguageVersionScore": 0,
    "highUrgencyLanguageVersionCount": 0,
    "averageMediaHintsScore": 47.109375,
    "highUrgencyMediaHintsCount": 0,
    "distinctSiteCount": 1,
    "singleSiteScan": true,
    "greenWeb": {
      "pageHostsChecked": 64,
      "pageHostsGreen": 0,
      "pageHostsNotGreen": 64,
      "pageHostsUnknown": 0,
      "externalOriginsChecked": 6,
      "externalOriginsGreen": 6,
      "externalOriginsNotGreen": 0,
      "externalOriginsUnknown": 0
    }
  },
  "budgetGuidance": {
    "wsgReference": {
      "id": "3.1",
      "title": "Set goals based on performance and energy impact",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact"
    },
    "benchmarkReference": {
      "name": "Sustainable Web Design Digital Carbon Ratings",
      "url": "https://sustainablewebdesign.org/digital-carbon-ratings/"
    },
    "current": {
      "averageTransferBytes": 2589051.28125,
      "averageCo2GramsPerPage": 0.991817389493044,
      "transferRating": "F",
      "co2Rating": "F"
    },
    "recommendedBudget": {
      "targetRating": "B",
      "maxTransferBytesPerPage": 999270.4,
      "maxCo2GramsPerPage": 0.145
    },
    "reductionsNeeded": {
      "transferBytesPerPage": {
        "absolute": 1589780.88125,
        "percent": 61.40399353088326,
        "needsReduction": true
      },
      "co2GramsPerPage": {
        "absolute": 0.846817389493044,
        "percent": 85.3803732888657,
        "needsReduction": true
      }
    },
    "stretchBudget": {
      "targetRating": "A",
      "maxTransferBytesPerPage": 543897.6,
      "maxCo2GramsPerPage": 0.079
    }
  },
  "thirdPartyJsSummary": {
    "wsgReference": {
      "title": "Give third parties the same priority as first parties during assessment",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
    },
    "averageScore": 43.53125,
    "highUrgencyPages": 0,
    "assessedPages": 64,
    "providers": [
      {
        "hostname": "www.googletagmanager.com",
        "pageCount": 52,
        "transferBytes": 15310521,
        "requestCount": 104,
        "status": "green",
        "hostedBy": "Google Cloud"
      },
      {
        "hostname": "js.hsforms.net",
        "pageCount": 52,
        "transferBytes": 10312140,
        "requestCount": 52,
        "status": "green",
        "hostedBy": "Cloudflare"
      },
      {
        "hostname": "www.google-analytics.com",
        "pageCount": 52,
        "transferBytes": 1086577,
        "requestCount": 52,
        "status": "green",
        "hostedBy": "Google Cloud"
      },
      {
        "hostname": "www.gstatic.com",
        "pageCount": 4,
        "transferBytes": 2670788,
        "requestCount": 8,
        "status": "green",
        "hostedBy": "Google Cloud"
      },
      {
        "hostname": "challenges.cloudflare.com",
        "pageCount": 2,
        "transferBytes": 35485,
        "requestCount": 2,
        "status": "green",
        "hostedBy": "Cloudflare"
      }
    ]
  },
  "externalProviderRiskSummary": {
    "recurringNonGreenProviders": [],
    "nonGreenProviders": [],
    "recurringUnknownProviders": []
  },
  "formValidationSummary": {
    "wsgReference": {
      "title": "Validate form errors and account for tooling requirements",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#validate-form-errors-and-account-for-tooling-requirements"
    },
    "uniqueElementSignaturesAssessed": 11,
    "totalOccurrences": 18,
    "reusedFromCacheCount": 7,
    "recurringElements": [
      {
        "signature": "no-form|select|select|tabs|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "select",
        "fieldName": "tabs",
        "score": 90,
        "urgency": "high",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "no-form|input|checkbox|web_cms|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "web_cms",
        "score": 50,
        "urgency": "medium",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "no-form|input|checkbox|it_service_modernization|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "it_service_modernization",
        "score": 50,
        "urgency": "medium",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "no-form|input|checkbox|product_design|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "product_design",
        "score": 50,
        "urgency": "medium",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "no-form|input|checkbox|security_compliance|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "security_compliance",
        "score": 50,
        "urgency": "medium",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "no-form|input|checkbox|data_services|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "data_services",
        "score": 50,
        "urgency": "medium",
        "pageCount": 2,
        "occurrenceCount": 2
      },
      {
        "signature": "no-form|input|checkbox|workforce_development|no-autocomplete|optional|no-pattern|no-minlength",
        "role": "form",
        "controlType": "checkbox",
        "fieldName": "workforce_development",
        "score": 50,
        "urgency": "medium",
        "pageCount": 2,
        "occurrenceCount": 2
      }
    ],
    "recurringSearchElements": []
  },
  "metadataSummary": {
    "wsgReference": {
      "title": "Structure metadata for machine readability",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#structure-metadata-for-machine-readability"
    },
    "assessedPages": 64,
    "averageScore": 1.25,
    "highUrgencyPages": 1,
    "missing": {
      "missingLang": 1,
      "missingDescription": 1,
      "missingCanonical": 1,
      "missingOpenGraphCore": 1,
      "missingTwitterCard": 1,
      "invalidStructuredData": 0
    }
  },
  "layoutSupportSummary": {
    "wsgReference": {
      "title": "Ensure layouts work for different devices and requirements",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-layouts-work-for-different-devices-and-requirements"
    },
    "assessedPages": 64,
    "averageScore": 30.15625,
    "highUrgencyPages": 0,
    "mobileOverflowPages": 0,
    "tabletOverflowPages": 0,
    "totalMobileSmallTapTargets": 2007,
    "totalTabletSmallTapTargets": 1987,
    "totalFixedWidthOffenders": 0,
    "pagesWithGridOverflow": 4,
    "totalGridOverflowContainers": 8,
    "totalGridContainersDetected": 308
  },
  "securityLightSummary": {
    "wsgReference": {
      "title": "Ensure that your code is secure",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-that-your-code-is-secure"
    },
    "assessedPages": 64,
    "averageScore": 51.390625,
    "highUrgencyPages": 4,
    "pagesWithoutCsp": 64,
    "pagesWithoutHsts": 53,
    "pagesWithVulnerableLibraries": 0,
    "totalExternalScriptsWithoutIntegrity": 75
  },
  "dependencyMaintenanceSummary": {
    "wsgReference": {
      "title": "Use dependencies appropriately and ensure maintenance",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
    },
    "assessedPages": 64,
    "averageScore": 2.34375,
    "highUrgencyPages": 0,
    "pagesWithVulnerableDependencies": 0,
    "totalVulnerableDependencies": 0,
    "topRecurringLibraries": []
  },
  "expectedFilesSummary": {
    "wsgReference": {
      "title": "Include expected and beneficial files",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#include-expected-and-beneficial-files"
    },
    "assessedPages": 64,
    "averageScore": 40,
    "highUrgencyPages": 0,
    "missing": {
      "robotsTxt": 0,
      "sitemapXml": 64,
      "securityTxt": 64,
      "webManifest": 0,
      "favicon": 64
    }
  },
  "compressionSummary": {
    "wsgReference": {
      "title": "Reduce data transfer with compression",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
    },
    "assessedPages": 64,
    "averageScore": 13.546875,
    "highUrgencyPages": 6,
    "pagesMissingTextCompression": 0,
    "totalEstimatedSavingsBytes": 58863596.14999999,
    "recurringOpportunities": [
      {
        "id": "modern-image-formats",
        "title": "Use modern image compression formats",
        "urgency": "high",
        "pageCount": 22,
        "totalEstimatedSavingsBytes": 58242360.14999999
      },
      {
        "id": "uses-optimized-images",
        "title": "Improve image encoding quality/size",
        "urgency": "high",
        "pageCount": 2,
        "totalEstimatedSavingsBytes": 621236
      }
    ]
  },
  "optimizationSummary": {
    "wsgReference": {
      "title": "Use the most efficient solution for your service",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
    },
    "assessedPages": 64,
    "averageScore": 81.25,
    "highUrgencyPages": 52,
    "totalEstimatedSavingsBytes": 172908234.14999998,
    "totalEstimatedBlockingMs": 0,
    "recurringOpportunities": [
      {
        "id": "offscreen-images",
        "title": "Lazy-load offscreen images",
        "pageCount": 52,
        "totalEstimatedSavingsBytes": 55532140,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "unused-javascript",
        "title": "Remove unused JavaScript",
        "pageCount": 52,
        "totalEstimatedSavingsBytes": 14427342,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "unused-css-rules",
        "title": "Remove unused CSS",
        "pageCount": 52,
        "totalEstimatedSavingsBytes": 974266,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "modern-image-formats",
        "title": "Serve images in next-gen formats",
        "pageCount": 22,
        "totalEstimatedSavingsBytes": 58242360.14999999,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "uses-responsive-images",
        "title": "Right-size images for viewport",
        "pageCount": 18,
        "totalEstimatedSavingsBytes": 43110890,
        "totalEstimatedBlockingMs": 0
      },
      {
        "id": "uses-optimized-images",
        "title": "Compress oversized image assets",
        "pageCount": 2,
        "totalEstimatedSavingsBytes": 621236,
        "totalEstimatedBlockingMs": 0
      }
    ]
  },
  "offlineSupportSummary": {
    "wsgReference": {
      "title": "Optimize caching and support offline access",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
    },
    "assessedPages": 64,
    "averageScore": 100,
    "highUrgencyPages": 64,
    "pagesWithoutServiceWorker": 64,
    "pagesWithoutOfflineSupport": 64,
    "pagesWithWeakCacheTtl": 64,
    "recurringOpportunities": [
      {
        "id": "service-worker",
        "title": "Add service worker support",
        "urgency": "high",
        "pageCount": 64
      },
      {
        "id": "works-offline",
        "title": "Ensure critical routes work offline",
        "urgency": "high",
        "pageCount": 64
      },
      {
        "id": "installable-manifest",
        "title": "Improve web app manifest support",
        "urgency": "medium",
        "pageCount": 64
      },
      {
        "id": "uses-long-cache-ttl",
        "title": "Strengthen static asset cache TTL",
        "urgency": "high",
        "pageCount": 64
      },
      {
        "id": "offline-start-url",
        "title": "Support offline start URL behavior",
        "urgency": "medium",
        "pageCount": 64
      }
    ]
  },
  "languageVersionSummary": {
    "wsgReference": {
      "title": "Use the latest stable language version",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
    },
    "assessedPages": 64,
    "averageScore": 0,
    "highUrgencyPages": 0,
    "pagesWithOutdatedRuntimeSignals": 0,
    "pagesWithVersionDisclosure": 0,
    "topOutdatedSignals": []
  },
  "mediaHintsSummary": {
    "wsgReference": {
      "title": "Optimize media to reduce resource use",
      "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use"
    },
    "assessedPages": 64,
    "averageScore": 47.109375,
    "highUrgencyPages": 0,
    "pagesWithAutoplay": 0,
    "pagesWithUnmutedAutoplay": 0,
    "pagesWithoutDarkMode": 63,
    "pagesWithLazyLoadingGap": 63
  },
  "gridAwareSummary": {
    "assessedPages": 64,
    "pagesWithDetection": 0,
    "detectedUrls": []
  },
  "wsgHighlightsSummary": {
    "assessedPages": 64,
    "averageScore": 45.234375,
    "highlights": [
      {
        "guideline": "17.1",
        "title": "Missing print style sheet",
        "urgency": "low",
        "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
        "wsid": "17.printed documents",
        "assessor": "script",
        "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}",
        "pageCount": 64,
        "pages": {},
        "criteria": {
          "title": "Printed documents",
          "description": "Design your process to reduce the need for paper documents. Where the production of paper documents is essential, it should be designed to have the lowest impact possible. Include a CSS print style sheet and test it with different types of content. Encourage saving documents in digital formats over paper-based storage and archiving.",
          "resources": [
            {
              "A Guide To The State Of Print Stylesheets In 2018": "https://www.smashingmagazine.com/2018/05/print-stylesheets-in-2018/",
              "Changing Paper Consumption": "http://www.greenschools.net/article.php-id=75.html",
              "CSS Design: Going to Print": "https://alistapart.com/article/goingtoprint/",
              "GR491 - 6-3044 - Paper Printing": "https://gr491.isit-europe.org/en/crit.php?id=6-3044-uxui-the-flows-of-dematerialization-are-sometimes-broken",
              "GR491 - 9-5076 - Ink Saving": "https://gr491.isit-europe.org/en/crit.php?id=9-5076-frontend-the-flows-of-dematerialization-are-sometimes-broken",
              "GreenIT - 0031 - Provide a print CSS": "https://rweb.greenit.fr/en/fiches/RWEB_0031-provide-a-css-print",
              "How to Become an Eco Web Designer": "https://onextrapixel.com/how-to-become-an-eco-web-designer/",
              "OpQuast - 190 - The website offers styles dedicated to printing.": "https://checklists.opquast.com/en/digital-quality/the-site-provides-at-least-one-style-sheet-for-printing",
              "OpQuast - 191 - The content of each page can be printed without printing the navigation blocks.": "https://checklists.opquast.com/en/digital-quality/the-content-of-each-page-can-be-printed-without-navigation-blocks",
              "Printed - Print Friendly CSS Library": "https://printedcss.com/",
              "UI Tools": "https://designsustainably.eu/uitools/",
              "United Nations SDGS - Goal 11 - Human Habitats": "https://sdgs.un.org/goals/goal11#targets_and_indicators",
              "United Nations SDGS - Goal 12 - Consumption & Production": "https://sdgs.un.org/goals/goal12#targets_and_indicators",
              "Using UX Design to Build a Sustainable Future": "https://uxmag.com/articles/using-ux-design-to-build-a-sustainable-future",
              "Which Fonts Use The Least Ink & Toner?": "https://www.tonerbuzz.com/blog/which-fonts-use-the-least-ink-toner/"
            }
          ],
          "guideline": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "17",
            "title": "Reduce the impact of downloadable and physical documents",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-the-impact-of-downloadable-and-physical-documents",
            "subheading": "Reduce the need for physical documents as much as possible by allowing the saving of well-labeled, optimized digital downloads. Include a print style sheet to avoid resource waste."
          },
          "benefits": [
            {
              "Accessibility": "Providing a range of inclusively designed downloadable documents in a variety of formats benefits those with accessibility needs as they can choose the ideal format for their device and use case.",
              "Environment": "Reducing the need to print documents or providing a print friendly style sheet reduces emissions associated with paper, ink, and the act of printing.",
              "Performance": "Compressing or otherwise optimizing documents means they can be downloaded faster, avoiding users needing to wait to view documents prepared for offline viewing."
            }
          ],
          "example": null
        }
      },
      {
        "guideline": "12.3",
        "title": "No reduced motion support",
        "urgency": "low",
        "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
        "wsid": "12.control animation",
        "assessor": "script",
        "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}",
        "pageCount": 64,
        "pages": {},
        "criteria": {
          "title": "Control animation",
          "description": "Allow users to start, stop, pause, or otherwise control animated content.",
          "resources": [
            {
              "Accessible Web Animation": "https://css-tricks.com/accessible-web-animation-the-wcag-on-animation-explained/",
              "Animated sites are unique, but not always accessible": "https://uxdesign.cc/animated-sites-are-unique-but-not-always-accessible-5af54fefa092",
              "Animation and motion": "https://web.dev/learn/accessibility/motion?hl=en-us",
              "Animation that fails safely": "https://adobe.design/stories/leading-design/animation-that-fails-safely-defensive-design-for-motion-sensitive-users",
              "GPF - General Policy Framework (PDF) - 4.1 - UX and UI (Autoplay)": "https://www.arcep.fr/uploads/tx_gspublication/general_policy_framework_for_the_ecodesign_of_digital_services_version_2024.pdf",
              "GPF - General Policy Framework (PDF) - 4.6 - UX and UI (Informational Media)": "https://www.arcep.fr/uploads/tx_gspublication/general_policy_framework_for_the_ecodesign_of_digital_services_version_2024.pdf",
              "GR491 - 7-5051 - Animation Frequency": "https://gr491.isit-europe.org/en/crit.php?id=7-5051-frontend-the-presentation-of-operations-on-the-front",
              "Let users pause/stop/hide animation": "https://marcom.wwu.edu/accessibility/guide/pause-stop-hide-animation",
              "prefers-reduced-motion: Sometimes less movement is more": "https://web.dev/articles/prefers-reduced-motion?hl=en",
              "Respecting Users' Motion Preferences": "https://www.smashingmagazine.com/2021/10/respecting-users-motion-preferences/"
            }
          ],
          "guideline": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "12",
            "title": "Ensure animation is proportionate and easy to control",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-animation-is-proportionate-and-easy-to-control",
            "subheading": "Ensure any animation deemed necessary is not overdone and that the user can control its ability to run."
          },
          "benefits": [
            {
              "Environment": "Disabling and reducing animation to the essential, with appropriate optimization and user control, reduces rendering impact and associated emissions.",
              "Performance": "Compressing, removing, or otherwise reducing animation files reduces complexity, improving performance.",
              "Social Equity": "Catering to different perspectives on and preferences in relation to animation can improve acceptance and access for individuals using different devices and from different backgrounds."
            }
          ],
          "example": "@media (prefers-reduced-motion: reduce) {\r\n\tbody *,\r\n\tbody *::before,\r\n\tbody *::after {\r\n\t\tanimation-delay: -1ms !important;\r\n\t\tanimation-duration: 1ms !important;\r\n\t\tanimation-iteration-count: 1 !important;\r\n\t\tbackground-attachment: initial !important;\r\n\t\ttransition-duration: 1ms !important;\r\n\t\ttransition-delay: -1ms !important;\r\n\t\tscroll-behavior: auto !important;\r\n\t}\r\n}"
        }
      },
      {
        "guideline": "13.1",
        "title": "Missing system font fallback",
        "urgency": "medium",
        "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
        "wsid": "13.pre-installed typefaces",
        "assessor": "script",
        "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}",
        "pageCount": 64,
        "pages": {},
        "criteria": {
          "title": "Pre-installed typefaces",
          "description": "Use pre-installed fonts, such as system fonts, wherever possible, to reduce the reliance on user-installed or web fonts.",
          "resources": [
            {
              "Apple System Fonts": "https://developer.apple.com/fonts/system-fonts/",
              "CSS Fonts": "https://www.cssfontstack.com/",
              "Fabulous Font-Face Fallbacks": "https://calendar.perfplanet.com/2024/fabulous-font-face-fallbacks/",
              "Fallback Font Generator": "https://screenspan.net/fallback",
              "Fallback lister": "https://r12a.github.io/scripts/fontlist/",
              "Font style matcher": "https://meowni.ca/font-style-matcher/",
              "GR491 - 2-4016 - System Fonts": "https://gr491.isit-europe.org/en/crit.php?id=2-4016-contents-system-fonts-are-embedded-in-the-presentation",
              "GreenIT - 0032 - Prefer standard fonts": "https://rweb.greenit.fr/en/fiches/RWEB_0032-prefer-standard-fonts",
              "How can we design sustainably?": "https://medium.com/@sandra.pallier/how-can-we-design-sustainably-3be7530a0f5b",
              "List of typefaces included with macOS": "https://en.wikipedia.org/wiki/List_of_typefaces_included_with_macOS",
              "List of typefaces included with Microsoft Windows": "https://en.wikipedia.org/wiki/List_of_typefaces_included_with_Microsoft_Windows",
              "Matrix of fonts bundled with Mac and Windows operating systems, Microsoft Office and Adobe Creative Suite": "https://media.24ways.org/2007/17/fontmatrix.html",
              "Modern Font Stacks": "https://modernfontstacks.com/",
              "System Font Stack": "https://systemfontstack.com/",
              "Using UX Design to Build a Sustainable Future": "https://uxmag.com/articles/using-ux-design-to-build-a-sustainable-future",
              "Web Almanac: Sustainability": "https://almanac.httparchive.org/en/2024/sustainability",
              "Web fonts: when you need them, when you don't": "https://david-gilbertson.medium.com/web-fonts-when-you-need-them-when-you-dont-a3b4b39fe0ae"
            }
          ],
          "guideline": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "13",
            "title": "Use optimized and appropriate web typography",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-optimized-and-appropriate-web-typography",
            "subheading": "Provide custom fonts in the most suitable file format, but with a preference for pre-installed typefaces where possible."
          },
          "benefits": [
            {
              "Environment": "Reducing the number and complexity of custom fonts used reduces data transfer and rendering effort, which lowers associated emissions.",
              "Performance": "Using optimized web fonts or system fonts supports a smoother user experience and faster rendering.",
              "Social Equity": "System fonts are preinstalled and are reliable, ensuring content can always be presented fast in a font users are familiar with."
            }
          ],
          "example": "font-family: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;"
        }
      },
      {
        "guideline": "2.4",
        "title": "Review User Journey Efficiency",
        "urgency": "investigate",
        "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
        "wsid": "2.minimize non-essential content",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "2.6",
        "title": "Check for Engagement Traps",
        "urgency": "investigate",
        "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
        "wsid": "2.design to assist not distract",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "2.7",
        "title": "Audit for Deceptive Design Patterns",
        "urgency": "investigate",
        "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
        "wsid": "2.avoid manipulative deceptive",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "2.14",
        "title": "Verify Accessible Alternatives for All Media",
        "urgency": "investigate",
        "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
        "wsid": "2.offer suitable alternatives",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "2.18",
        "title": "Confirm User Research Was Conducted",
        "urgency": "investigate",
        "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
        "wsid": "2.involve users early",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "2.10",
        "title": "Review Content Conciseness",
        "urgency": "investigate",
        "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
        "wsid": "2.provide clear inclusive content",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
        "assessor": "ai",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "4.4",
        "title": "Verify Error Pages and Redirects Are Configured",
        "urgency": "investigate",
        "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
        "wsid": "4.error pages redirection",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "4.10",
        "title": "Review CDN Usage and Geographic Distribution",
        "urgency": "investigate",
        "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
        "wsid": "4.content delivery networks",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "5.2",
        "title": "Confirm a Sustainability Advocate Is Assigned",
        "urgency": "investigate",
        "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
        "wsid": "5.assign sustainability advocate",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "5.8",
        "title": "Check for a Public Sustainability Statement",
        "urgency": "investigate",
        "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
        "wsid": "5.support mandatory disclosures",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
        "assessor": "human",
        "pageCount": 64,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "11.3",
        "title": "Incomplete media lazy loading",
        "urgency": "medium",
        "detail": "Only 0/16 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
        "wsid": "11.lazy loading",
        "assessor": "script",
        "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>",
        "pageCount": 63,
        "pages": {},
        "criteria": {
          "title": "Lazy loading",
          "description": "Incorporate lazy/deferred loading from the start: Consider which media elements are immediately required, and which would be better relegated to loading on specific user interaction. Load data-intensive media on the client side, including the media itself, behind a facade - a non-functional and static representational element.",
          "resources": [
            {
              "Avoid hotlinking images with Cross-Origin-Resource-Policy": "https://www.sjoerdlangkemper.nl/2024/11/27/avoid-hotlinking-images-with-corp-cross-origin-resource-policy/",
              "Fast load times: Optimize Your Images": "https://web.dev/explore/fast?hl=en#optimize-your-images",
              "GPF - General Policy Framework (PDF) - 4.1 - UX and UI (Autoplay)": "https://www.arcep.fr/uploads/tx_gspublication/general_policy_framework_for_the_ecodesign_of_digital_services_version_2024.pdf",
              "GR491 - 9-5071 - Autoplay": "https://gr491.isit-europe.org/en/crit.php?id=9-5071-frontend-active-content-uses-technical-resources-to-function.",
              "GR491 - 9-5068 - Lazy Loading": "https://gr491.isit-europe.org/en/crit.php?id=9-5068-frontend-when-loading-the-service-on-the-user",
              "GreenIT - 0051 - Use lazy loading": "https://rweb.greenit.fr/en/fiches/RWEB_0051-use-lazy-loading",
              "How to Defer Offscreen Images and Background Images": "https://www.debugbear.com/blog/defer-offscreen-images",
              "Lazy Load Background Images with the IntersectionObserver API": "https://www.debugbear.com/blog/lazy-load-background-images-intersection-observer",
              "Lazy load third-party resources with facades": "https://developer.chrome.com/docs/lighthouse/performance/third-party-facades?hl=en",
              "Lazy loading (Wikipedia)": "https://en.wikipedia.org/wiki/Lazy_loading",
              "Lazy loading (Performance)": "https://developer.mozilla.org/en-US/docs/Web/Performance/Guides/Lazy_loading",
              "Lazy Loading Images Based on Screen Size": "https://www.aaron-gustafson.com/notebook/lazy-loading-images-based-on-screen-size/",
              "Non-blocking cross-browser image rendering on the canvas": "https://calendar.perfplanet.com/2025/non-blocking-image-canvas/",
              "Web Almanac: Sustainability": "https://almanac.httparchive.org/en/2024/sustainability"
            }
          ],
          "guideline": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "benefits": [
            {
              "Economic": "Eliminating data-intensive media entirely and using alternatives such as transcripts reduce costs associated with hosting and data transfer.",
              "Environment": "Reducing the battery drain associated with loading data-intensive content by preventing auto-loading or delaying it until the moment it is required reduces energy emissions associated with data transfer and renering.",
              "Performance": "Tailoring user experience to the device, situation, and environment of the user by having different resolutions and quality formats available reduces wasted bandwidth. This can boost performance for users who make choices to reduce the data downloaded.",
              "Social Equity": "Providing alternatives to data-intensive media allows with limited bandwidth or older devices to access content."
            }
          ],
          "example": "<picture> \n  <source type=\"image/avif\" srcset=\"image.avif\">\n  <source type=\"image/webp\" srcset=\"image.webp\">\n  <img width=\"100px\" height=\"100px\" src=\"image.jpg\" alt=\"\" loading=\"lazy\"/>\n</picture>"
        }
      },
      {
        "guideline": "7.3",
        "title": "Multiple tracking scripts detected",
        "urgency": "medium",
        "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
        "wsid": "7.analytics and tracking",
        "assessor": "script",
        "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>",
        "pageCount": 63,
        "pages": {},
        "criteria": {
          "title": "Analytics and tracking",
          "description": "Evaluate and remove unnecessary or unused analytics and tracking, especially any operating without user consent.",
          "resources": [
            {
              "48 Cart Abandonment Rate Statistics 2023": "https://baymard.com/lists/cart-abandonment-rate",
              "Guide to using analytics for performance and privacy": "https://www.wholegraindigital.com/blog/guide-to-using-analytics-for-performance-and-privacy/",
              "Is GDPR Good for the Environment?": "https://www.mightybytes.com/insights/is-gdpr-good-for-the-environment/",
              "Learn Privacy": "https://web.dev/blog/introducing-learn-privacy?hl=en",
              "Review of Web Analytic Tools for Sustainable Design (PDF)": "https://www.techrxiv.org/users/708350/articles/692959/master/file/data/092900a237/092900a237.pdf",
              "Tracking Protection in Firefox For Privacy and Performance (PDF)": "https://www.ieee-security.org/TC/SPW2015/W2SP/papers/W2SP_2015_submission_32.pdf",
              "United Nations SDGS - Goal 1 - Poverty": "https://sdgs.un.org/goals/goal1#targets_and_indicators",
              "United Nations SDGS - Goal 3 - Health & Well-being": "https://sdgs.un.org/goals/goal3#targets_and_indicators",
              "Why you should stop using Google Analytics on your website": "https://plausible.io/blog/remove-google-analytics"
            }
          ],
          "guideline": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "7",
            "title": "Avoid being manipulative or deceptive",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "subheading": "Avoid using patterns, content, tools, or techniques that may artificially manipulate or deceive the user."
          },
          "benefits": [
            {
              "Accessibility": "Avoiding deceptive design patterns improves user experience for people using assistive technologies, as these can be especially disruptive when using a screen reader. This improves their trust and access to your content.",
              "Conversion": "Avoiding deceptive patterns can result in fewer complaints, reduce barriers, and improve conversion.",
              "Environment": "Avoiding deceptive design patterns reduces energy consumption because users do not waste time and energy trying to undo choices they never intended to make.",
              "Performance": "Using ethical, non-disruptive practices will accelerate the user journey and perceived speed and reduce unnecessary friction.",
              "Privacy": "Ensuring compliance with ethical privacy practices and avoiding dark and deceptive patterns reduces litigation risk. It also reduces data transmission between tracking and advertising services providers."
            }
          ],
          "example": null
        }
      },
      {
        "guideline": "2.5",
        "title": "Missing explicit navigation structure",
        "urgency": "medium",
        "detail": "No <nav> or role=\"navigation\" tags found. Proper wayfinding helps users find content efficiently and reduces unnecessary page loads.",
        "wsid": "2.navigation wayfinding",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-that-navigation-and-wayfinding-are-well-structured",
        "assessor": "script",
        "example": "<nav aria-label=\"Primary\">\n  <ul>\n    <li><a href=\"/\">Home</a></li>\n  </ul>\n</nav>",
        "pageCount": 1,
        "pages": {},
        "criteria": null
      },
      {
        "guideline": "3.7",
        "title": "Missing main content landmark",
        "urgency": "medium",
        "detail": "No <main> or role=\"main\" tags found. Semantic HTML reduces code bloat and allows both assistive technology and web crawlers to parse content more efficiently.",
        "wsid": "3.ensure code follows good semantic practices",
        "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-code-follows-good-semantic-practices",
        "assessor": "script",
        "example": "<main>\n  <article>\n    <h1>Page Title</h1>\n    <p>Content goes here.</p>\n  </article>\n</main>",
        "pageCount": 1,
        "pages": {},
        "criteria": null
      }
    ]
  },
  "siteGuidance": {
    "siteCount": 1,
    "singleSiteScan": true,
    "sites": [
      {
        "origin": "https://civicactions.com",
        "pageCount": 64,
        "sharedRecommendations": [
          {
            "area": "expected-files",
            "urgency": "medium",
            "title": "Add sitemap.xml at site origin",
            "detail": "sitemap.xml is missing for all sampled pages on https://civicactions.com."
          },
          {
            "area": "expected-files",
            "urgency": "low",
            "title": "Publish .well-known/security.txt",
            "detail": ".well-known/security.txt is missing for all sampled pages on https://civicactions.com."
          },
          {
            "area": "security-headers",
            "urgency": "high",
            "title": "Apply Content-Security-Policy site-wide",
            "detail": "CSP is absent across all sampled pages on https://civicactions.com."
          },
          {
            "area": "offline-support",
            "urgency": "high",
            "title": "Introduce service worker support",
            "detail": "No sampled pages on https://civicactions.com indicate service worker support for offline resilience."
          },
          {
            "area": "offline-support",
            "urgency": "high",
            "title": "Support offline fallback behavior",
            "detail": "Offline page behavior was not detected across sampled pages on https://civicactions.com."
          },
          {
            "area": "optimization",
            "urgency": "medium",
            "title": "Fix recurring optimization bloat at shared layer",
            "detail": "Lazy-load offscreen images recurs across 52 pages on https://civicactions.com (est. 52.96 MB aggregate savings)."
          },
          {
            "area": "compression",
            "urgency": "high",
            "title": "Prioritize recurring compression fixes",
            "detail": "Use modern image compression formats recurs across 22 pages on https://civicactions.com (est. 55.54 MB aggregate savings)."
          },
          {
            "area": "offline-support",
            "urgency": "high",
            "title": "Prioritize recurring offline/caching improvements",
            "detail": "Add service worker support is needed across 64 pages on https://civicactions.com."
          }
        ],
        "recurringCompression": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "pageCount": 22,
            "totalEstimatedSavingsBytes": 58242360.14999999
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "pageCount": 2,
            "totalEstimatedSavingsBytes": 621236
          }
        ],
        "recurringOptimization": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "pageCount": 52,
            "totalEstimatedSavingsBytes": 55532140,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "pageCount": 52,
            "totalEstimatedSavingsBytes": 14427342,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "pageCount": 52,
            "totalEstimatedSavingsBytes": 974266,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "pageCount": 22,
            "totalEstimatedSavingsBytes": 58242360.14999999,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "pageCount": 18,
            "totalEstimatedSavingsBytes": 43110890,
            "totalEstimatedBlockingMs": 0
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "pageCount": 2,
            "totalEstimatedSavingsBytes": 621236,
            "totalEstimatedBlockingMs": 0
          }
        ],
        "recurringOfflineOpportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "pageCount": 64
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "pageCount": 64
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "pageCount": 64
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "pageCount": 64
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "pageCount": 64
          }
        ],
        "recurringDependencies": [],
        "recurringRuntimeSignals": [],
        "pageSpecific": [
          {
            "url": "https://civicactions.com/case-studies/globalnet-platform-support/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 81,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 43,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 10.11 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 11.60 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 10.11 MB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/va-cms-modernization/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 73,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 42,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 8.16 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 8.37 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 8.16 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.91 MB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/va-cms-modernization",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 73,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 42,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 8.16 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 8.37 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 8.16 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.91 MB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/nsf-website-redesign/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 73,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 36,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 9.10 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 9.10 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 9.01 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 2.43 MB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/georgia-workforce-open-data/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 58,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 1.84 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 1.84 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.65 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 376.59 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/va-alt-text/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 61,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 45,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 1.73 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 1.73 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 1.19 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 691.92 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/dept-of-education-system-lifecycle-development-management/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 68,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 37,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 5.51 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 5.51 MB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.82 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 3.28 MB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 59,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 37,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 465.00 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 372.37 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 465.00 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 400.16 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/careers/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 40,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 988.59 KB."
              },
              {
                "title": "Improve image encoding quality/size",
                "urgency": "high",
                "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 234.30 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 1.25 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 988.59 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/services/ditap/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 39,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 695.50 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 873.16 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 695.50 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 457.32 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/services/ditap",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 39,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 695.50 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 873.15 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 695.50 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 457.32 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 35,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 49,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 664.82 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 754.78 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 664.82 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/cms-web-experience-services/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 37,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 36,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 568.51 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 697.52 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 568.51 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/cms-web-experience-services",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 37,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 36,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 568.51 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 697.52 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 568.51 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.13 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 19,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 2.78 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 13.44 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 2.78 MB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 19,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 2.78 MB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "high",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 13.44 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 2.78 MB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 269.58 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/fcc-website-modernization/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 14,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "medium",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 178.60 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 488.67 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.07 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "medium",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 178.60 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 12,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "medium",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 142.44 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 269.88 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 264.31 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "medium",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 142.44 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/feedback/",
            "securityScore": 61,
            "dependencyScore": 8,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.98 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.25 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/services/ditap/register/",
            "securityScore": 61,
            "dependencyScore": 8,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.97 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.42 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/services/ditap/register",
            "securityScore": 61,
            "dependencyScore": 8,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.01 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.41 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/feedback",
            "securityScore": 61,
            "dependencyScore": 8,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.01 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.25 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/cms-design-challenge-mvp",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 12,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "medium",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 142.44 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 264.62 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "medium",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 142.44 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 8,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "high",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 288.74 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "high",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 2.62 MB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "high",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 288.74 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.67 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2024-07-09-CivicActions-Appoints-Mike-Gifford/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.65 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2024-01-16-CivicActions-Announces-Impact-Report/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.38 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2024-01-05-CivicActions-Partners-with-aamdsif/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.53 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2022-04-21-civicactions-announces-Ryerson-partnership-digital-accessibility/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.41 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2022-01-05-civicactions-named-govtech-100-top-government-technology-companies-list/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.13 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.16 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2021-09-08-civicactions-announces-ditap-grads-across-federal-agencies/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.60 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2021-07-19-civicactions-announces-va-ditap-graduation/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.13 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.51 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2021-07-08-gsa-engages-civicactions-to-modernize-vpat/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.19 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.44 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2021-05-11-civicactions-wins-department-of-ed-recompete/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.33 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2021-05-03-civicactions-wins-nsf-recompete/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.68 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.38 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2020-11-09-civicactions-acquires-openconcept/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.49 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2020-08-14-civicactions-certified-to-deliver-ditap/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.45 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2020-03-02-civicactions-wins-cms-contract/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.21 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.35 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.24 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/2/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.20 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.27 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/press/3/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.68 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.21 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/accessibility-statement/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.83 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/contact/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.06 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 18.79 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/contracting/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.68 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 75.82 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "medium",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 38.88 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/licensing/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.36 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/privacy/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.74 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/services/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 44.56 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 21.25 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/services2/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 18.22 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.64 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/styles/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 18.22 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.85 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/open-acr/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 7,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 41,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "medium",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 74.28 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 269.29 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 149.06 KB."
              },
              {
                "title": "Serve images in next-gen formats",
                "urgency": "medium",
                "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 74.28 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/cybergeek/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 3,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 44,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "Use modern image compression formats",
                "urgency": "low",
                "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 35.11 KB."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 95.90 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "medium",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 61.62 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/sustainability/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 46,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "low",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
              },
              {
                "title": "Remove unused CSS",
                "urgency": "low",
                "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.81 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/team/",
            "securityScore": 55,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 100,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 31,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "Remove unused JavaScript",
                "urgency": "high",
                "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.67 KB."
              },
              {
                "title": "Lazy-load offscreen images",
                "urgency": "medium",
                "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 49.91 KB."
              },
              {
                "title": "Right-size images for viewport",
                "urgency": "low",
                "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 21.02 KB."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks%20/",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/cms-web-experience-services/fearless.tech",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/CMS.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/Medicare.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/Openpaymentsdata.cms.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/Data.medicaid.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/Data.healthcare.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/SDIS.medicaid.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/PFS.data.cms.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/Drupal-10/QIC.cms.gov",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/case-studies/fearless.tech",
            "securityScore": 32,
            "dependencyScore": 2,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 50,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          },
          {
            "url": "https://civicactions.com/manifest.webmanifest",
            "securityScore": 53,
            "dependencyScore": 0,
            "expectedFilesScore": 40,
            "compressionScore": 0,
            "optimizationScore": 0,
            "offlineScore": 100,
            "languageScore": 0,
            "mediaHintsScore": 0,
            "urgency": "high",
            "topRecommendations": [
              {
                "title": "No major compression opportunity detected",
                "urgency": "low",
                "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
              },
              {
                "title": "No obvious optimization bloat signals",
                "urgency": "low",
                "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
              },
              {
                "title": "Add service worker support",
                "urgency": "high",
                "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
              },
              {
                "title": "Ensure critical routes work offline",
                "urgency": "high",
                "detail": "Provide an offline fallback strategy for key pages and shell assets."
              }
            ]
          }
        ]
      }
    ]
  },
  "crossPagePatterns": {
    "heavyAssetPatterns": [
      {
        "key": "script|www.googletagmanager.com|/gtag",
        "label": "script assets from www.googletagmanager.com/gtag",
        "resourceType": "script",
        "domain": "www.googletagmanager.com",
        "pageCount": 52,
        "totalTransferBytes": 15310521,
        "exampleUrl": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0"
      },
      {
        "key": "script|js.hsforms.net|/forms",
        "label": "script assets from js.hsforms.net/forms",
        "resourceType": "script",
        "domain": "js.hsforms.net",
        "pageCount": 52,
        "totalTransferBytes": 10312140,
        "exampleUrl": "https://js.hsforms.net/forms/v2.js"
      },
      {
        "key": "image|storage.googleapis.com|/ca-it-prod-home-5918-strapi",
        "label": "image assets from storage.googleapis.com/ca-it-prod-home-5918-strapi",
        "resourceType": "image",
        "domain": "storage.googleapis.com",
        "pageCount": 19,
        "totalTransferBytes": 93316621,
        "exampleUrl": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg"
      },
      {
        "key": "font|fonts.gstatic.com|/s",
        "label": "font assets from fonts.gstatic.com/s",
        "resourceType": "font",
        "domain": "fonts.gstatic.com",
        "pageCount": 4,
        "totalTransferBytes": 7753399,
        "exampleUrl": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2"
      },
      {
        "key": "script|www.gstatic.com|/_",
        "label": "script assets from www.gstatic.com/_",
        "resourceType": "script",
        "domain": "www.gstatic.com",
        "pageCount": 4,
        "totalTransferBytes": 2510796,
        "exampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base"
      },
      {
        "key": "xhr|www.gstatic.com|/_",
        "label": "xhr assets from www.gstatic.com/_",
        "resourceType": "xhr",
        "domain": "www.gstatic.com",
        "pageCount": 4,
        "totalTransferBytes": 695398,
        "exampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=0/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=sy2q,sy2t,sy2u,sy5n,syc2,sydr,sydz,sye0,fmklff,QvB8bb,bCfhJc,N5Lqpc,sy8p,u9ZRK,pItcJd,yZuGp,sy2c,qTnoBf,NJ1rfe,sydw,sydy,gJzDyc,eFy6Rc,sy3f,sy6r,sy9a,sy9m,sy9p,sya6,syb1,sy9c,sy9h,syax,syaz,syb2,sy4k,sy6k,sya7,syar,syb6,p2tbsc,nV4ih,syb5,LxALBf,sy1c,m9oV,sy1f,sy3u,sy1r,sy22,RAnnUd,i5dxUd,sy1l,i5H9N,sy83,syc5,etBPYb,SU9Rsf,sy1e,sy1h,sy1p,sy84,syc6,sy4x,PHUIyb,qNG0Fc,syc7,syc8,syc9,sycb,sy6l,sy1d,syc3,ywOR5c,sycd,sych,EcW08c,wg1P6b,syca,sycc,syce,sycf,sycg,t8tqF,SM1lmd,syck,sycl,sybd,sybg,sycj,sycm,vofJp,QwQO1b,sya5,syau,sy6e,sy9g,syat,syay,syb0,syas,sy9d,syaq,QMSdQb,X16vkb,WdhPgc,Vnjw0c,sy4n,sy4o,sy4l,sy4p,Ibqgte,ok0nye,Hzqecd,Vp87Bf,JCrucd,DhgO0d,oZECf,sy3a,akEJMc,sy3b,sy3c,zG2TEe,sycz,fvFQfe,CNqcN,sbHRWb,syd6,TOfxwf,sydb,sy20,sy8m,sy8o,syak,syal,syao,sydc,syda,sydg,sydi,sye6,sye7,A2m8uc,sye1,sye2,sy1m,sy1n,sydt,sye3,sy55,sycp,sye4,sye5,cNHZjb,sy3d,sy3e,sy3n,lzHmAf,sy3k,sy3l,sy3m,sy3o,jjSbr,syd7,yUS4Lc,v4y9Mc,KOZzeb,KFVhZe,sy63,sy9t,syaw,xKXrob,sy62,sy64,sy6y,sy7y,sy9n,sy9u,syan,syav,DPwS9e,sydk,sydl,sydo,sydj,sydn,syaj,sydm,riEgMd,sydu,lSvzH,D8e5bc,j0HcBf,sycx,syd8,sydd,sydf,sydh,syde,RGrRJf,OkF2xb,sy9o,xmYr4,UmOCme,ID6c7,sye8,rmdjlf"
      },
      {
        "key": "stylesheet|www.gstatic.com|/_",
        "label": "stylesheet assets from www.gstatic.com/_",
        "resourceType": "stylesheet",
        "domain": "www.gstatic.com",
        "pageCount": 4,
        "totalTransferBytes": 621128,
        "exampleUrl": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw"
      },
      {
        "key": "image|civicactions.com|/static",
        "label": "image assets from civicactions.com/static",
        "resourceType": "image",
        "domain": "civicactions.com",
        "pageCount": 2,
        "totalTransferBytes": 2141693,
        "exampleUrl": "https://civicactions.com/static/david-sumner-d07ae2466241fa3abe23fa8776f0deb4.jpg"
      },
      {
        "key": "xhr|challenges.cloudflare.com|/cdn-cgi",
        "label": "xhr assets from challenges.cloudflare.com/cdn-cgi",
        "resourceType": "xhr",
        "domain": "challenges.cloudflare.com",
        "pageCount": 2,
        "totalTransferBytes": 859127,
        "exampleUrl": "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/flow/ov1/341676307:1776705261:XhaGbmbyh2jcePkdmC8EcE_iGGMhVq9GAVH_XtleYbA/9ef5e5f5aa159db4/XyzjsIUU9c2.hivcC42DJ8k38nZiGV6SPZ2.BDT3Ctk-1776706450-1.2.1.1-YNP8VpHIoVHGBJor34eToPIxUOVkdjEgpHvJJv9wXosazcMNjs_uhCEyBkIYRY3A"
      }
    ],
    "recurringTargets": [
      {
        "title": "Split JavaScript by route or interaction",
        "urgency": "high",
        "pageCount": 52,
        "totalEstimatedSavingsBytes": 14427342,
        "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand."
      },
      {
        "title": "Modularize heavy script asset from js.hsforms.net",
        "urgency": "medium",
        "pageCount": 43,
        "totalEstimatedSavingsBytes": 8527386,
        "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles."
      },
      {
        "title": "Modularize heavy script asset from www.googletagmanager.com",
        "urgency": "medium",
        "pageCount": 34,
        "totalEstimatedSavingsBytes": 5985887,
        "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles."
      },
      {
        "title": "Lazy-load offscreen images and media galleries",
        "urgency": "high",
        "pageCount": 31,
        "totalEstimatedSavingsBytes": 55023346,
        "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section."
      },
      {
        "title": "Modularize heavy image asset from storage.googleapis.com",
        "urgency": "high",
        "pageCount": 19,
        "totalEstimatedSavingsBytes": 67022159,
        "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component."
      },
      {
        "title": "Modularize heavy script asset from www.gstatic.com",
        "urgency": "high",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 2510796,
        "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles."
      },
      {
        "title": "Modularize heavy font asset from fonts.gstatic.com",
        "urgency": "medium",
        "pageCount": 4,
        "totalEstimatedSavingsBytes": 905724,
        "strategy": "Subset or defer this font so full font payloads are only fetched when needed."
      },
      {
        "title": "Modularize heavy image asset from civicactions.com",
        "urgency": "high",
        "pageCount": 2,
        "totalEstimatedSavingsBytes": 747125,
        "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component."
      },
      {
        "title": "Modularize heavy xhr asset from challenges.cloudflare.com",
        "urgency": "high",
        "pageCount": 2,
        "totalEstimatedSavingsBytes": 580880,
        "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger."
      }
    ],
    "recurringOrigins": [
      {
        "domain": "www.googletagmanager.com",
        "pageCount": 52,
        "totalTransferBytes": 15310521
      },
      {
        "domain": "js.hsforms.net",
        "pageCount": 52,
        "totalTransferBytes": 10312140
      },
      {
        "domain": "storage.googleapis.com",
        "pageCount": 19,
        "totalTransferBytes": 93316621
      },
      {
        "domain": "fonts.gstatic.com",
        "pageCount": 4,
        "totalTransferBytes": 11725722
      },
      {
        "domain": "www.gstatic.com",
        "pageCount": 4,
        "totalTransferBytes": 3827322
      },
      {
        "domain": "civicactions.com",
        "pageCount": 2,
        "totalTransferBytes": 2141693
      },
      {
        "domain": "challenges.cloudflare.com",
        "pageCount": 2,
        "totalTransferBytes": 859127
      }
    ],
    "designSystemGuidance": [
      "This same heavy image pattern appears on 19 pages. Fix it once in the shared template, CMS block, or design system component to reduce load across the whole site.",
      "These 3 script bundles are recurring modularization targets. Move the fix to the shared bundle or component boundary so every affected page gets lighter at once.",
      "These 3 modularization targets recur across multiple pages. Centralize the fix at the component or bundle level instead of treating each page separately.",
      "Heavy assets from www.googletagmanager.com recur across 52 pages. Review whether that dependency should be deferred, optimized, or loaded conditionally."
    ]
  },
  "results": [
    {
      "url": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
      "performanceScore": 0.77,
      "bestPracticesScore": 1,
      "transferBytes": 1248007,
      "co2Grams": 0.4780882687698001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294884,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198407,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 21409,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Building an MVP for Medicare.gov with human-centered design | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We did a fast-paced collaboration to submit deliverables in just 8 days, winning the design challenge to help CMS improve the customer experience of their websites.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
          "ogTitle": "Building an MVP for Medicare.gov with human-centered design | CivicActions",
          "ogDescription": "We did a fast-paced collaboration to submit deliverables in just 8 days, winning the design challenge to help CMS improve the customer experience of their websites.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 36,
          "tabletSmallTapTargets": 36,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 36 small targets on mobile and 36 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:29:21 GMT",
            "etag": "\"78174ee7304cd2d776810d7d395e3c08a1015e8539b0ec1e3ed0b7ee00381949-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200060-IAD",
            "x-timer": "S1776706162.738431,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 16
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "16 of 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 16,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/16 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 12,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 145862.30000000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 145862.30000000002,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 142.44 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 807364.3,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 276357,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 270 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 270656,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 264 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 145862.30000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 142 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 96637,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 94 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17852,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 269.88 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 264.31 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "medium",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 142.44 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 94.37 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.43 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 494865.5916666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 483.27 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 483.27 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 10,
        "urgency": "high",
        "transferBytes": 1248007,
        "css": {
          "unusedBytes": 17852,
          "ratio": 0.014304406946435396,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 276357,
          "duplicatedBytes": 0,
          "ratio": 0.2214386618023777,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17852,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 276357,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 1248007,
        "estimatedDeferrableBytes": 564865,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 270656,
          "unusedJavascriptSavings": 276357,
          "unusedCssSavings": 17852
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 270656,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 276357,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17852,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198407,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176149,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 122243,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 514700,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294884,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198407,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 21409,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 1248007,
        "estimatedRedundantBytes": 294209,
        "redundancyRatio": 0.2357430687488131,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 276357,
            "displayValue": "Est savings of 270 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17852,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 276357,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17852,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 37,
        "urgency": "medium",
        "totalTransferBytes": 1248007,
        "heavyRequestCount": 5,
        "heavyBytes": 718010,
        "heavyRatio": 0.5753252986561774,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198407,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176149,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg",
            "transferSize": 122243,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118735,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_1_9ecc4b385b/WECMS_Design_1_9ecc4b385b.jpg",
            "transferSize": 102476,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 493291
          },
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 224719
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294884
          },
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 224719
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198407
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 270656,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 276357,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198407,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176149,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 122243,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.2,
          "displayValue": "5.4 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 5.4 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 270 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 270 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 142 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 142 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 264 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 264 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": 0,
          "displayValue": "Est savings of 130 ms",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- Current value: Est savings of 130 ms\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/fcc-website-modernization/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/fcc-website-modernization/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 1350823,
      "co2Grams": 0.5174751659922,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294443,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198313,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Modernizing FCC.gov | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "In a fast-paced, comprehensive content migration, we applied agile development and DevSecOps to modernize a legacy federal website.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/fcc-website-modernization/",
          "ogTitle": "Modernizing FCC.gov | CivicActions",
          "ogDescription": "In a fast-paced, comprehensive content migration, we applied agile development and DevSecOps to modernize a legacy federal website.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/fcc-website-modernization/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:29:32 GMT",
            "etag": "\"1ff05af0d731b21d1dea8164e6357adb4fd56c5fde0f45d0b59da3fb79882966-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-served-by": "cache-iad-kcgs7200060-IAD",
            "x-timer": "S1776706172.125781,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 15
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "15 of 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 15,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/15 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 14,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 182886.7,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 182886.7,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 178.60 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 978484.7,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 500395,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 489 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277573,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 182886.7,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 179 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17630,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 488.67 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.07 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "medium",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 178.60 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.22 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 579344.6083333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 565.77 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 565.77 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 10,
        "urgency": "high",
        "transferBytes": 1350823,
        "css": {
          "unusedBytes": 17630,
          "ratio": 0.013051302798368107,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277573,
          "duplicatedBytes": 0,
          "ratio": 0.20548436027518038,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17630,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277573,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 19,
        "urgency": "high",
        "transferBytes": 1350823,
        "estimatedDeferrableBytes": 795598,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 500395,
          "unusedJavascriptSavings": 277573,
          "unusedCssSavings": 17630
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 500395,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277573,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17630,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198313,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 180765,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/FCC_2_70dd211527/FCC_2_70dd211527.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176039,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513631,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294443,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198313,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 12,
        "urgency": "medium",
        "transferBytes": 1350823,
        "estimatedRedundantBytes": 295203,
        "redundancyRatio": 0.2185356630735485,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277573,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17630,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277573,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17630,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 46,
        "urgency": "medium",
        "totalTransferBytes": 1350823,
        "heavyRequestCount": 6,
        "heavyBytes": 959804,
        "heavyRatio": 0.7105327641001079,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198313,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/FCC_2_70dd211527/FCC_2_70dd211527.jpg",
            "transferSize": 180765,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176039,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/FCC_3_958d1aaef3/FCC_3_958d1aaef3.jpg",
            "transferSize": 147771,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/FCC_1_2a1f2981d3/FCC_1_2a1f2981d3.jpg",
            "transferSize": 138512,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118404,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492756
          },
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 467048
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 3,
            "transferBytes": 467048
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294443
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198313
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 500395,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277573,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198313,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 180765,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/FCC_2_70dd211527/FCC_2_70dd211527.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176039,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.8,
          "displayValue": "2.9 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 2.9 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 179 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 179 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 489 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 489 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/georgia-workforce-open-data/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/georgia-workforce-open-data/",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 3307484,
      "co2Grams": 1.2670356011976,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294386,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198306,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Using open data to power Georgia’s healthcare workforce | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Using the DKAN open source open data platform, we built tools to help Georgia decision-makers plan for a resilient healthcare workforce.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/georgia-workforce-open-data/",
          "ogTitle": "Using open data to power Georgia’s healthcare workforce | CivicActions",
          "ogDescription": "Using the DKAN open source open data platform, we built tools to help Georgia decision-makers plan for a resilient healthcare workforce.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/georgia-workforce-open-data/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 34,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 34 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:29:42 GMT",
            "etag": "\"43eec66112ec8e1f9ad64804df541db4c2cf871cbbc32f025d8dd0e9bd5d1186-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-served-by": "cache-iad-kcgs7200060-IAD",
            "x-timer": "S1776706182.454074,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 15
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "15 of 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 15,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/15 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 58,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 1925012.65,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1925012.65,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 1.84 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 4339248.65,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 1925012.65,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,880 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 1733120,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,693 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 385632,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 377 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277643,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17841,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 1.84 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.65 MB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 376.59 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.42 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 2143933.9000000004
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 2.04 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 2.04 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 4,
        "urgency": "high",
        "transferBytes": 3307484,
        "css": {
          "unusedBytes": 17841,
          "ratio": 0.00539413040244488,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277643,
          "duplicatedBytes": 0,
          "ratio": 0.083943867906844,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17841,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 7,
        "urgency": "high",
        "transferBytes": 3307484,
        "estimatedDeferrableBytes": 681116,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 385632,
          "unusedJavascriptSavings": 277643,
          "unusedCssSavings": 17841
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 385632,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17841,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 2070558,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/GBHCW_hero_ef1aadb6b9/GBHCW_hero_ef1aadb6b9.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198306,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176033,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513567,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294386,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198306,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 5,
        "urgency": "medium",
        "transferBytes": 3307484,
        "estimatedRedundantBytes": 295484,
        "redundancyRatio": 0.08933799830928887,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277643,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17841,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17841,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 44,
        "urgency": "high",
        "totalTransferBytes": 3307484,
        "heavyRequestCount": 5,
        "heavyBytes": 2895638,
        "heavyRatio": 0.8754805767767886,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/GBHCW_hero_ef1aadb6b9/GBHCW_hero_ef1aadb6b9.png",
            "transferSize": 2070558,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/GBHCW_2_71ab09aeca/GBHCW_2_71ab09aeca.jpg",
            "transferSize": 332388,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198306,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176033,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118353,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 2402946
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492692
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 2402946
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294386
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198306
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 385632,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 2070558,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/GBHCW_hero_ef1aadb6b9/GBHCW_hero_ef1aadb6b9.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198306,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0,
          "displayValue": "16.8 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 16.8 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 1,880 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 1,880 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 377 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 377 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 3,230 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 3,230 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 3600371,
      "co2Grams": 1.3792351631994002,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294398,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Better transit service with real-time data | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Wrangling a vast network of real-time transit data, we used Drupal 8 and the Internet of Things to modernize digital subway signage in New York City.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks/",
          "ogTitle": "Better transit service with real-time data | CivicActions",
          "ogDescription": "Wrangling a vast network of real-time transit data, we used Drupal 8 and the Internet of Things to modernize digital subway signage in New York City.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:29:52 GMT",
            "etag": "\"37128ac698594032b2e0e23aeb50fbc324e8592d8f9370b91edc44f847bbb7e2-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-served-by": "cache-iad-kcgs7200060-IAD",
            "x-timer": "S1776706192.247054,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 15
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "15 of 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 15,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/15 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 8,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 295665.95,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 295665.95,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 288.74 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3339663.95,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 2748996,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 2,685 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 295665.95,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 289 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277169,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17833,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 2.62 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 288.74 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.67 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.42 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 2378505.2583333333
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 2.27 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 2.27 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 4,
        "urgency": "high",
        "transferBytes": 3600371,
        "css": {
          "unusedBytes": 17833,
          "ratio": 0.004953100666570195,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277169,
          "duplicatedBytes": 0,
          "ratio": 0.0769834553161327,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17833,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 29,
        "urgency": "high",
        "transferBytes": 3600371,
        "estimatedDeferrableBytes": 3043998,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 2748996,
          "unusedJavascriptSavings": 277169,
          "unusedCssSavings": 17833
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 2748996,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17833,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 2368871,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/MTA_1_5da100cebc/MTA_1_5da100cebc.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198307,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513580,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294398,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 5,
        "urgency": "medium",
        "transferBytes": 3600371,
        "estimatedRedundantBytes": 295002,
        "redundancyRatio": 0.0819365559827029,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277169,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17833,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17833,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 58,
        "urgency": "high",
        "totalTransferBytes": 3600371,
        "heavyRequestCount": 6,
        "heavyBytes": 3208711,
        "heavyRatio": 0.8912167662721425,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/MTA_1_5da100cebc/MTA_1_5da100cebc.jpg",
            "transferSize": 2368871,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/MTA_3_6b3db3892a/MTA_3_6b3db3892a.png",
            "transferSize": 233295,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198307,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176055,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118343,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/MTA_2_d34e1d1f38/MTA_2_d34e1d1f38.png",
            "transferSize": 113840,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 2716006
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492705
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 3,
            "transferBytes": 2716006
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294398
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198307
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 2748996,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 2368871,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/MTA_1_5da100cebc/MTA_1_5da100cebc.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198307,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.8,
          "displayValue": "2.9 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 2.9 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 289 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 289 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 2,685 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 2,685 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 3,516 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 3,516 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/nsf-website-redesign/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/nsf-website-redesign/",
      "performanceScore": 0.63,
      "bestPracticesScore": 1,
      "transferBytes": 12996492,
      "co2Grams": 4.978714350448801,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294435,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198302,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "A smoother path to scientific research and discovery | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Using human-centered design and the latest Drupal technology, we helped NSF build a dynamic website to advance their mission.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/nsf-website-redesign/",
          "ogTitle": "A smoother path to scientific research and discovery | CivicActions",
          "ogDescription": "Using human-centered design and the latest Drupal technology, we helped NSF build a dynamic website to advance their mission.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/nsf-website-redesign/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:30:03 GMT",
            "etag": "\"5ff1391019dfe5a8ff789356f79151cd7af6e8e7b49fadc6c0626fda579a243e-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-served-by": "cache-iad-kcgs7200060-IAD",
            "x-timer": "S1776706203.084640,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 36,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 55,
          "imagesWithLazy": 13,
          "imagesWithoutLazy": 42
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "42 of 55 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 55,
            "lazyImages": 13,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 13/55 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 73,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 9543741.25,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 9543741.25,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 9.10 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 21832505.25,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 9543741.25,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 9,320 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 9451806,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 9,230 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 2543020,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 2,483 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277602,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 16336,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 16 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 9.10 MB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 9.01 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 2.43 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 15.95 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 9873154.866666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 9.42 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 9.42 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 12996492,
        "css": {
          "unusedBytes": 16336,
          "ratio": 0.0012569545689713809,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277602,
          "duplicatedBytes": 0,
          "ratio": 0.02135976385012202,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 16336,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 26,
        "urgency": "high",
        "transferBytes": 12996492,
        "estimatedDeferrableBytes": 9745744,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 9451806,
          "unusedJavascriptSavings": 277602,
          "unusedCssSavings": 16336
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 9451806,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 16336,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8633178,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/NSF_2_47110bd4c6/NSF_2_47110bd4c6.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198302,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513612,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294435,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198302,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 1,
        "urgency": "medium",
        "transferBytes": 12996492,
        "estimatedRedundantBytes": 293938,
        "redundancyRatio": 0.0226167184190934,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277602,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 16336,
            "displayValue": "Est savings of 16 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 16336,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 59,
        "urgency": "high",
        "totalTransferBytes": 12996492,
        "heavyRequestCount": 6,
        "heavyBytes": 12490853,
        "heavyRatio": 0.9610941937255069,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/NSF_2_47110bd4c6/NSF_2_47110bd4c6.png",
            "transferSize": 8633178,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/NSF_hero_814592da8e/NSF_hero_814592da8e.png",
            "transferSize": 2664469,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/NSF_1_b61a326fd8/NSF_1_b61a326fd8.png",
            "transferSize": 700469,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198302,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176028,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118407,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 11998116
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492737
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 3,
            "transferBytes": 11998116
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294435
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198302
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 9451806,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 8633178,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/NSF_2_47110bd4c6/NSF_2_47110bd4c6.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0,
          "displayValue": "20.7 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 20.7 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 9,320 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 9,320 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 16 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 16 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 9,230 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 9,230 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 12,692 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 12,692 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/va-cms-modernization/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/va-cms-modernization/",
      "performanceScore": 0.65,
      "bestPracticesScore": 1,
      "transferBytes": 11736156,
      "co2Grams": 4.4959030710984,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294412,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Helping Veterans access care and benefits online | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We joined the modernization effort at VA to implement a modern Drupal content management system and empower a Veteran-first approach to online healthcare.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/va-cms-modernization/",
          "ogTitle": "Helping Veterans access care and benefits online | CivicActions",
          "ogDescription": "We joined the modernization effort at VA to implement a modern Drupal content management system and empower a Veteran-first approach to online healthcare.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/va-cms-modernization/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:30:13 GMT",
            "etag": "\"bd056533b07e556edc5b8842f0806c60c069b3320802ce655bb661cf6e69a3b3-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706213.366534,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 42,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 23,
          "imagesWithLazy": 3,
          "imagesWithoutLazy": 20
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "20 of 23 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 23,
            "lazyImages": 3,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 3/23 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 73,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 8556885,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 8556885,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 8.16 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 19632916,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 8781047,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8,575 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 8556885,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8,356 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 1999278,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,952 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277647,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18059,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 8.37 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 8.16 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.91 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.64 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 8871066.55
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 8.46 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 8.46 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 11736156,
        "css": {
          "unusedBytes": 18059,
          "ratio": 0.0015387491440979483,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277647,
          "duplicatedBytes": 0,
          "ratio": 0.023657405371912233,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18059,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277647,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 27,
        "urgency": "high",
        "transferBytes": 11736156,
        "estimatedDeferrableBytes": 9076753,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 8781047,
          "unusedJavascriptSavings": 277647,
          "unusedCssSavings": 18059
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8781047,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277647,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18059,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8748908,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_2_160c4ebf95/VA_2_160c4ebf95.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198300,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513587,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294412,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 1,
        "urgency": "medium",
        "transferBytes": 11736156,
        "estimatedRedundantBytes": 295706,
        "redundancyRatio": 0.02519615451601018,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277647,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18059,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277647,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18059,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 59,
        "urgency": "high",
        "totalTransferBytes": 11736156,
        "heavyRequestCount": 5,
        "heavyBytes": 11324428,
        "heavyRatio": 0.9649179850710914,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_2_160c4ebf95/VA_2_160c4ebf95.png",
            "transferSize": 8748908,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_hero_46cae3d67f/VA_hero_46cae3d67f.png",
            "transferSize": 2082808,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198300,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176055,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118357,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 10831716
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492712
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 10831716
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294412
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198300
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 8781047,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277647,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 8748908,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_2_160c4ebf95/VA_2_160c4ebf95.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198300,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0,
          "displayValue": "17.3 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 17.3 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 8,356 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 8,356 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 8,575 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 8,575 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 11,461 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 11,461 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/open-acr/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/open-acr/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 1095518,
      "co2Grams": 0.4196725691652,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294386,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198414,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 21409,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "OpenACR (Accessibility Conformance Reporting) | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Modernizing the Accessibility Conformance Reporting (ACR) Process",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/open-acr/",
          "ogTitle": "OpenACR (Accessibility Conformance Reporting) | CivicActions",
          "ogDescription": "Modernizing the Accessibility Conformance Reporting (ACR) Process",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/open-acr/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:30:23 GMT",
            "etag": "\"bbdc949ac768addd6476950795a091356f9682450a167908d7c3cb58db0b4623-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706223.195341,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 41,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 26,
          "imagesWithLazy": 4,
          "imagesWithoutLazy": 22
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "22 of 26 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 26,
            "lazyImages": 4,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 4/26 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 7,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 76064.3,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 76064.3,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 74.28 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 584391.3,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 275748,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 269 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 152639,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 149 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 76064.3,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 74 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 60850,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 59 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 19090,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 19 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 269.29 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 149.06 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "medium",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 74.28 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 59.42 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 18.64 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 355601.10000000003
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 347.27 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 347.27 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 12,
        "urgency": "high",
        "transferBytes": 1095518,
        "css": {
          "unusedBytes": 19090,
          "ratio": 0.017425546636385708,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 275748,
          "duplicatedBytes": 0,
          "ratio": 0.25170558585071173,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 19090,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 275748,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 13,
        "urgency": "high",
        "transferBytes": 1095518,
        "estimatedDeferrableBytes": 447477,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 152639,
          "unusedJavascriptSavings": 275748,
          "unusedCssSavings": 19090
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 152639,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 275748,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 19090,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198414,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176033,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 119184,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/overview_openacr_4042e002ce/overview_openacr_4042e002ce.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 514209,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294386,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198414,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 21409,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "medium",
        "transferBytes": 1095518,
        "estimatedRedundantBytes": 294838,
        "redundancyRatio": 0.2691311324870974,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 275748,
            "displayValue": "Est savings of 269 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 19090,
            "displayValue": "Est savings of 19 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 275748,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 19090,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 34,
        "urgency": "medium",
        "totalTransferBytes": 1095518,
        "heavyRequestCount": 4,
        "heavyBytes": 611984,
        "heavyRatio": 0.5586252348204228,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198414,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176033,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/overview_openacr_4042e002ce/overview_openacr_4042e002ce.png",
            "transferSize": 119184,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118353,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492800
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 119184
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294386
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198414
          },
          {
            "domain": "storage.googleapis.com",
            "count": 1,
            "transferBytes": 119184
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 152639,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 275748,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198414,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176033,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 119184,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/overview_openacr_4042e002ce/overview_openacr_4042e002ce.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.83,
          "displayValue": "2.8 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 2.8 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 269 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 269 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 19 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 19 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 74 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 74 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 149 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 149 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/va-alt-text/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/va-alt-text/",
      "performanceScore": 0.7,
      "bestPracticesScore": 1,
      "transferBytes": 2962899,
      "co2Grams": 1.1350314969786002,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294383,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198318,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Better Accessibility Through Alternative Text Validation | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We updated VA.gov based on user research to create better alternative (alt) text in order to provide a more accessible experience for Veterans.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/va-alt-text/",
          "ogTitle": "Better Accessibility Through Alternative Text Validation | CivicActions",
          "ogDescription": "We updated VA.gov based on user research to create better alternative (alt) text in order to provide a more accessible experience for Veterans.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/va-alt-text/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 30,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 7,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 2,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 5,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 30 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:30:33 GMT",
            "etag": "\"5abeceeba68d766b83bcf5292b3672edf502694110090dd83c7b5e12dfb44d16-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706233.404719,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 45,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 22,
          "imagesWithLazy": 2,
          "imagesWithoutLazy": 20
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "20 of 22 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 22,
            "lazyImages": 2,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/22 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 61,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1817309.4000000001,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1817309.4000000001,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 1.73 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 4073461.4000000004,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 1817309.4000000001,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,775 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 1252859,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,223 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 708529,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 692 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277202,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17562,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 1.73 MB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 1.19 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 691.92 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.71 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.15 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 1854836.6
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 1.77 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 1.77 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 4,
        "urgency": "high",
        "transferBytes": 2962899,
        "css": {
          "unusedBytes": 17562,
          "ratio": 0.005927302955652555,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277202,
          "duplicatedBytes": 0,
          "ratio": 0.09355769467673383,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17562,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277202,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 18,
        "urgency": "high",
        "transferBytes": 2962899,
        "estimatedDeferrableBytes": 1547623,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 1252859,
          "unusedJavascriptSavings": 277202,
          "unusedCssSavings": 17562
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1252859,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277202,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17562,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 841785,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/va_1_101ba6383a/va_1_101ba6383a.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198318,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513576,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294383,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198318,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 5,
        "urgency": "medium",
        "transferBytes": 2962899,
        "estimatedRedundantBytes": 294764,
        "redundancyRatio": 0.09948499763238638,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277202,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17562,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277202,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17562,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 52,
        "urgency": "high",
        "totalTransferBytes": 2962899,
        "heavyRequestCount": 7,
        "heavyBytes": 2554108,
        "heavyRatio": 0.8620300590739003,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/va_1_101ba6383a/va_1_101ba6383a.png",
            "transferSize": 841785,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/va_1_7ea5f51049/va_1_7ea5f51049.png",
            "transferSize": 841775,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/va_4_9416e44da9/va_4_9416e44da9.png",
            "transferSize": 258242,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198318,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176033,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/va_2_1848f2c99b/va_2_1848f2c99b.png",
            "transferSize": 119605,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118350,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 2061407
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492701
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 4,
            "transferBytes": 2061407
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294383
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198318
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 1252859,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277202,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 841785,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/va_1_101ba6383a/va_1_101ba6383a.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0,
          "displayValue": "11.3 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 11.3 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 1,775 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 1,775 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 1,223 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 1,223 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 2,893 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 2,893 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/",
      "performanceScore": 0.71,
      "bestPracticesScore": 1,
      "transferBytes": 1448461,
      "co2Grams": 0.5548784677254,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294409,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198315,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "An Upgraded Experience with Drupal 10 | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/Drupal-10/",
          "ogTitle": "An Upgraded Experience with Drupal 10 | CivicActions",
          "ogDescription": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/Drupal-10/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 35,
          "tabletSmallTapTargets": 37,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 9,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0,
            "gridContainersDetected": 6,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 35 small targets on mobile and 37 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:30:43 GMT",
            "etag": "\"df80fecd3b9d4a4372c97ccd5a322fa0eaa4d847889469cb10e12065ba689e76-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706244.804595,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 37,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 37,
          "imagesWithLazy": 8,
          "imagesWithoutLazy": 29
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "29 of 37 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 37,
            "lazyImages": 8,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 8/37 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 59,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 857475,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 476165,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "estimatedSavingsBytes": 381310,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 465.00 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 372.37 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1595955,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 476165,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 465 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 409760,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 400 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 381310,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 372 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277614,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 33505,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 33 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17601,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 465.00 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 400.16 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 372.37 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 32.72 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.19 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 637340.125
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 622.40 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 622.40 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 9,
        "urgency": "high",
        "transferBytes": 1448461,
        "css": {
          "unusedBytes": 17601,
          "ratio": 0.01215151805951282,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277614,
          "duplicatedBytes": 0,
          "ratio": 0.19166135643279314,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17601,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 7,
        "urgency": "medium",
        "transferBytes": 1448461,
        "estimatedDeferrableBytes": 328720,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 33505,
          "unusedJavascriptSavings": 277614,
          "unusedCssSavings": 17601
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 33505,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17601,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 539540,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/hero_image_d10_9d8047c393/hero_image_d10_9d8047c393.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198315,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513599,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294409,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198315,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 1448461,
        "estimatedRedundantBytes": 295215,
        "redundancyRatio": 0.20381287449230598,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277614,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17601,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17601,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 37,
        "urgency": "medium",
        "totalTransferBytes": 1448461,
        "heavyRequestCount": 4,
        "heavyBytes": 1032264,
        "heavyRatio": 0.7126626122484485,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/hero_image_d10_9d8047c393/hero_image_d10_9d8047c393.jpg",
            "transferSize": 539540,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198315,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176055,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118354,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 539540
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492724
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 1,
            "transferBytes": 539540
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294409
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198315
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 33505,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 539540,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/hero_image_d10_9d8047c393/hero_image_d10_9d8047c393.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198315,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.05,
          "displayValue": "7.1 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 7.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 465 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 465 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": 0,
          "displayValue": "Est savings of 372 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- Current value: Est savings of 372 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 33 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 33 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/globalnet-platform-support/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/globalnet-platform-support/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 13029942,
      "co2Grams": 4.9915284232788,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294400,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198312,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "A global professional networking platform for security practitioners | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We redesigned and rebuilt the GlobalNET platform to enable secure international collaboration, and now we provide ongoing DevOps and IT support services.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/globalnet-platform-support/",
          "ogTitle": "A global professional networking platform for security practitioners | CivicActions",
          "ogDescription": "We redesigned and rebuilt the GlobalNET platform to enable secure international collaboration, and now we provide ongoing DevOps and IT support services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/globalnet-platform-support/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 30,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 30 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:30:53 GMT",
            "etag": "\"bf5fd4c6be4d890e26842a7d7c5db2ea28af27e1c22507b256a8267dd0a29a87-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706254.790255,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 43,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 24,
          "imagesWithLazy": 3,
          "imagesWithoutLazy": 21
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "21 of 24 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 24,
            "lazyImages": 3,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 3/24 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 81,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 10601667.7,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 10601667.7,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 10.11 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 23055321.7,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 12158364,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 11,873 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 10601667.7,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 10,353 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277613,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17677,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 11.60 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 10.11 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.26 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 9907175.65
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 9.45 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 9.45 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 13029942,
        "css": {
          "unusedBytes": 17677,
          "ratio": 0.0013566445652636058,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277613,
          "duplicatedBytes": 0,
          "ratio": 0.021305774039516064,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17677,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 33,
        "urgency": "high",
        "transferBytes": 13029942,
        "estimatedDeferrableBytes": 12453654,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 12158364,
          "unusedJavascriptSavings": 277613,
          "unusedCssSavings": 17677
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 12158364,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17677,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 10733601,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/Global_NET_3_574cbb9a6d/Global_NET_3_574cbb9a6d.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198312,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176047,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513587,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294400,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198312,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 1,
        "urgency": "medium",
        "transferBytes": 13029942,
        "estimatedRedundantBytes": 295290,
        "redundancyRatio": 0.022662418604779667,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277613,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17677,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17677,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 64,
        "urgency": "high",
        "totalTransferBytes": 13029942,
        "heavyRequestCount": 6,
        "heavyBytes": 12619550,
        "heavyRatio": 0.9685039273390472,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/Global_NET_3_574cbb9a6d/Global_NET_3_574cbb9a6d.png",
            "transferSize": 10733601,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/Global_NET_1_a55d7eeaf2/Global_NET_1_a55d7eeaf2.png",
            "transferSize": 1271647,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198312,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176047,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/Global_NET_2_2cf92fc972/Global_NET_2_2cf92fc972.jpg",
            "transferSize": 121590,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118353,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 12126838
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492712
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 3,
            "transferBytes": 12126838
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294400
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198312
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 12158364,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 10733601,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/Global_NET_3_574cbb9a6d/Global_NET_3_574cbb9a6d.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198312,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.81,
          "displayValue": "2.9 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 2.9 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 10,353 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 10,353 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 11,873 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 11,873 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 12,725 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 12,725 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/dept-of-education-system-lifecycle-development-management/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/dept-of-education-system-lifecycle-development-management/",
      "performanceScore": 0.64,
      "bestPracticesScore": 1,
      "transferBytes": 8459663,
      "co2Grams": 3.2407395455682,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294403,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198309,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Modern learning platforms for adult education | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We streamlined a mix of legacy federal websites into a modern, secure platform to support the adult education community — and now we provide ongoing support and improvements.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/dept-of-education-system-lifecycle-development-management/",
          "ogTitle": "Modern learning platforms for adult education | CivicActions",
          "ogDescription": "We streamlined a mix of legacy federal websites into a modern, secure platform to support the adult education community — and now we provide ongoing support and improvements.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/dept-of-education-system-lifecycle-development-management/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:03 GMT",
            "etag": "\"39c80513f9b60c7ed54e885735e61d6832e7fee3c16d63573f16f1710640ca8e-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706264.987347,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 37,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 38,
          "imagesWithLazy": 8,
          "imagesWithoutLazy": 30
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "30 of 38 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 38,
            "lazyImages": 8,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 8/38 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 68,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 5776235,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 5776235,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 5.51 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 13518747,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 5776235,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 5,641 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 4003508,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,910 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 3443797,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 3,363 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277649,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17558,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 5.51 MB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 3.82 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 3.28 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.15 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 6244347.975
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 5.96 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 5.96 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 2,
        "urgency": "high",
        "transferBytes": 8459663,
        "css": {
          "unusedBytes": 17558,
          "ratio": 0.0020754963879766842,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277649,
          "duplicatedBytes": 0,
          "ratio": 0.0328203381151235,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17558,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 18,
        "urgency": "high",
        "transferBytes": 8459663,
        "estimatedDeferrableBytes": 4298715,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 4003508,
          "unusedJavascriptSavings": 277649,
          "unusedCssSavings": 17558
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 4003508,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17558,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 3970647,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/LINCS_1_09a3754dbf/LINCS_1_09a3754dbf.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198309,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513587,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294403,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198309,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 2,
        "urgency": "medium",
        "transferBytes": 8459663,
        "estimatedRedundantBytes": 295207,
        "redundancyRatio": 0.03489583450310018,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277649,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17558,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17558,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 53,
        "urgency": "high",
        "totalTransferBytes": 8459663,
        "heavyRequestCount": 5,
        "heavyBytes": 8041019,
        "heavyRatio": 0.9505129223232651,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/LINCS_1_09a3754dbf/LINCS_1_09a3754dbf.png",
            "transferSize": 3970647,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/LINCS_hero_a62d9ee986/LINCS_hero_a62d9ee986.png",
            "transferSize": 3577660,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198309,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176055,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118348,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 7548307
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492712
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 7548307
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294403
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198309
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 4003508,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 3970647,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/LINCS_1_09a3754dbf/LINCS_1_09a3754dbf.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198309,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0,
          "displayValue": "34.2 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 34.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 5,641 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 5,641 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 3,910 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 3,910 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 8,261 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 8,261 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/cybergeek/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/cybergeek/",
      "performanceScore": 0.81,
      "bestPracticesScore": 1,
      "transferBytes": 1050118,
      "co2Grams": 0.4022806736052001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294416,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198304,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Modernizing and Streamlining Cybersecurity Information at Centers for Medicare and Medicaid Services (CMS) | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We worked alongside ISPG customers and stakeholders to design and build a searchable, user-friendly portal for cybersecurity information – making it easier for security personnel to keep CMS data and systems safe.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/cybergeek/",
          "ogTitle": "Modernizing and Streamlining Cybersecurity Information at Centers for Medicare and Medicaid Services (CMS) | CivicActions",
          "ogDescription": "We worked alongside ISPG customers and stakeholders to design and build a searchable, user-friendly portal for cybersecurity information – making it easier for security personnel to keep CMS data and systems safe.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/cybergeek/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 34,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 34 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:13 GMT",
            "etag": "\"cb4ce50b6f0968f5635fdc5a6a26f993bfe60c63f2572344ddb75b425822668f-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706274.708423,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 44,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 21,
          "imagesWithLazy": 2,
          "imagesWithoutLazy": 19
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "19 of 21 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 21,
            "lazyImages": 2,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 2/21 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 3,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 35953.450000000004,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "low",
            "estimatedSavingsBytes": 35953.450000000004,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "low",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 35.11 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 492631.45,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277650,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 98206,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 96 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 63096,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 62 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 35953.450000000004,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 35 KiB",
            "urgency": "low",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17726,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 95.90 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 61.62 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "low",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 35.11 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.31 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 324003.98333333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 316.41 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 316.41 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 12,
        "urgency": "high",
        "transferBytes": 1050118,
        "css": {
          "unusedBytes": 17726,
          "ratio": 0.01688000777055531,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277650,
          "duplicatedBytes": 0,
          "ratio": 0.2643988580330972,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17726,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277650,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 12,
        "urgency": "medium",
        "transferBytes": 1050118,
        "estimatedDeferrableBytes": 393582,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 98206,
          "unusedJavascriptSavings": 277650,
          "unusedCssSavings": 17726
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 98206,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277650,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17726,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198304,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 83108,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/cybergeek_hero_2b25a8ab03/cybergeek_hero_2b25a8ab03.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513595,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294416,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198304,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 15,
        "urgency": "medium",
        "transferBytes": 1050118,
        "estimatedRedundantBytes": 295376,
        "redundancyRatio": 0.2812788658036525,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277650,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17726,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277650,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17726,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 29,
        "urgency": "medium",
        "totalTransferBytes": 1050118,
        "heavyRequestCount": 3,
        "heavyBytes": 492720,
        "heavyRatio": 0.469204413218324,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198304,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176055,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118361,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492720
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294416
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198304
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 98206,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277650,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198304,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.37,
          "displayValue": "4.5 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 4.5 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 35 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 35 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 96 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 96 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/cms-web-experience-services/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/cms-web-experience-services/",
      "performanceScore": 0.92,
      "bestPracticesScore": 1,
      "transferBytes": 1592066,
      "co2Grams": 0.6098908721724,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294413,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198303,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Improving the online experience for Medicare beneficiaries | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We are working to re-platform and redesign legacy systems for CMS, making it easier for millions of people to get the benefits they need.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/cms-web-experience-services/",
          "ogTitle": "Improving the online experience for Medicare beneficiaries | CivicActions",
          "ogDescription": "We are working to re-platform and redesign legacy systems for CMS, making it easier for millions of people to get the benefits they need.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/cms-web-experience-services/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:23 GMT",
            "etag": "\"0734499b4480ce5f2c988aa296b06f9a7381eefe292f0af28529fe6c1bb485ef-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706284.618323,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 36,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 43,
          "imagesWithLazy": 10,
          "imagesWithoutLazy": 33
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "33 of 43 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 43,
            "lazyImages": 10,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 10/43 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 37,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 582155,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 582155,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 568.51 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1591010,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 714256,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 698 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 582155,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 569 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277649,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 16950,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 697.52 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 568.51 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 16.55 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 750406.225
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 732.82 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 732.82 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 8,
        "urgency": "high",
        "transferBytes": 1592066,
        "css": {
          "unusedBytes": 16950,
          "ratio": 0.01064654354781774,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277649,
          "duplicatedBytes": 0,
          "ratio": 0.1743954082305633,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 16950,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 21,
        "urgency": "high",
        "transferBytes": 1592066,
        "estimatedDeferrableBytes": 1008855,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 714256,
          "unusedJavascriptSavings": 277649,
          "unusedCssSavings": 16950
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 714256,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 16950,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 680887,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_1_1c50d1865e/WECMS_1_1c50d1865e.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198303,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513591,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294413,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198303,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 10,
        "urgency": "medium",
        "transferBytes": 1592066,
        "estimatedRedundantBytes": 294599,
        "redundancyRatio": 0.18504195177838104,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277649,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 16950,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 16950,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 46,
        "urgency": "high",
        "totalTransferBytes": 1592066,
        "heavyRequestCount": 4,
        "heavyBytes": 1173603,
        "heavyRatio": 0.7371572535309466,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_1_1c50d1865e/WECMS_1_1c50d1865e.png",
            "transferSize": 680887,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198303,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176055,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118358,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 680887
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492716
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 1,
            "transferBytes": 680887
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294413
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198303
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 714256,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 680887,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_1_1c50d1865e/WECMS_1_1c50d1865e.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198303,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176055,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.78,
          "displayValue": "3.0 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.0 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 569 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 569 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 698 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 698 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2024-07-09-CivicActions-Appoints-Mike-Gifford/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2024-07-09-CivicActions-Appoints-Mike-Gifford/",
      "performanceScore": 0.91,
      "bestPracticesScore": 1,
      "transferBytes": 885853,
      "co2Grams": 0.3393538074342,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294403,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198312,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Appoints Mike Gifford as Open Standards & Practices Lead, Expanding Commitment to an Open Ecosystem of Vendors and Agencies | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2024-07-09-CivicActions-Appoints-Mike-Gifford/",
          "ogTitle": "CivicActions Appoints Mike Gifford as Open Standards & Practices Lead, Expanding Commitment to an Open Ecosystem of Vendors and Agencies | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2024-07-09-CivicActions-Appoints-Mike-Gifford/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:32 GMT",
            "etag": "\"63984a8a3648c4219f117e3f31feec0863d20ae4e83569d186612b5e26d487cd-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706293.842597,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 335389,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277649,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 39662,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18078,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.65 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205705.25
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 885853,
        "css": {
          "unusedBytes": 18078,
          "ratio": 0.02040744909144068,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277649,
          "duplicatedBytes": 0,
          "ratio": 0.3134255909276144,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18078,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 885853,
        "estimatedDeferrableBytes": 335389,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 39662,
          "unusedJavascriptSavings": 277649,
          "unusedCssSavings": 18078
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 39662,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18078,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198312,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176050,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513590,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294403,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198312,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 885853,
        "estimatedRedundantBytes": 295727,
        "redundancyRatio": 0.33383304001905506,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277649,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18078,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18078,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 885853,
        "heavyRequestCount": 3,
        "heavyBytes": 492715,
        "heavyRatio": 0.5562040203058521,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198312,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176050,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118353,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492715
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294403
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198312
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 39662,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277649,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198312,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176050,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 39 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 39 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2024-01-16-CivicActions-Announces-Impact-Report/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2024-01-16-CivicActions-Announces-Impact-Report/",
      "performanceScore": 0.88,
      "bestPracticesScore": 1,
      "transferBytes": 881448,
      "co2Grams": 0.3376663338672,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294406,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198302,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Announces 2023 Impact Report | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2024-01-16-CivicActions-Announces-Impact-Report/",
          "ogTitle": "CivicActions Announces 2023 Impact Report | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2024-01-16-CivicActions-Announces-Impact-Report/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:41 GMT",
            "etag": "\"23026f9dc40d7db1819381c3a6e0358d514f02d02092efc267bca3b9d41ea01a-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706302.822878,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320214,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277609,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24813,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17792,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.38 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205695.6666666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881448,
        "css": {
          "unusedBytes": 17792,
          "ratio": 0.020184968370227173,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277609,
          "duplicatedBytes": 0,
          "ratio": 0.31494654250732884,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17792,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277609,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881448,
        "estimatedDeferrableBytes": 320214,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24813,
          "unusedJavascriptSavings": 277609,
          "unusedCssSavings": 17792
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24813,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277609,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17792,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198302,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176050,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513583,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294406,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198302,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881448,
        "estimatedRedundantBytes": 295401,
        "redundancyRatio": 0.33513151087755605,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277609,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17792,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277609,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17792,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881448,
        "heavyRequestCount": 3,
        "heavyBytes": 492708,
        "heavyRatio": 0.5589756854630109,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198302,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "transferSize": 176050,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118356,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492708
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294406
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198302
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277609,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198302,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176050,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.58,
          "displayValue": "3.7 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.7 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 24 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2024-01-05-CivicActions-Partners-with-aamdsif/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2024-01-05-CivicActions-Partners-with-aamdsif/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 882080,
      "co2Grams": 0.33790844131200004,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Partners with Aplastic Anemia & MDS International Foundation (AAMDSIF) for Drupal 10 Migration | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2024-01-05-CivicActions-Partners-with-aamdsif/",
          "ogTitle": "CivicActions Partners with Aplastic Anemia & MDS International Foundation (AAMDSIF) for Drupal 10 Migration | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2024-01-05-CivicActions-Partners-with-aamdsif/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:50 GMT",
            "etag": "\"a25674b6a42580d58b1691cb998df0c3db99e2786a9c484096c8e0c8a08c7379-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706311.707433,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320384,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277621,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17949,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.53 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205698.5416666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 882080,
        "css": {
          "unusedBytes": 17949,
          "ratio": 0.020348494467621984,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277621,
          "duplicatedBytes": 0,
          "ratio": 0.314734491202612,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17949,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277621,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 882080,
        "estimatedDeferrableBytes": 320384,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277621,
          "unusedCssSavings": 17949
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277621,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17949,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198305,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176031,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513612,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 882080,
        "estimatedRedundantBytes": 295570,
        "redundancyRatio": 0.335082985670234,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277621,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17949,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277621,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17949,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 882080,
        "heavyRequestCount": 3,
        "heavyBytes": 492737,
        "heavyRatio": 0.5586080627607474,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198305,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176031,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118401,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492737
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294432
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198305
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277621,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198305,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176031,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2022-04-21-civicactions-announces-Ryerson-partnership-digital-accessibility/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2022-04-21-civicactions-announces-Ryerson-partnership-digital-accessibility/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 881753,
      "co2Grams": 0.3377831736942001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294395,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Ryerson University partners with CivicActions to advance digital accessibility | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2022-04-21-civicactions-announces-Ryerson-partnership-digital-accessibility/",
          "ogTitle": "Ryerson University partners with CivicActions to advance digital accessibility | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2022-04-21-civicactions-announces-Ryerson-partnership-digital-accessibility/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:31:59 GMT",
            "etag": "\"6b6427012f40eef37e1ce8c047a16d6d56222e2333d393aa6de046a18a70aaa4-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706320.541633,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320297,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277659,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17824,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.41 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205698.5416666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881753,
        "css": {
          "unusedBytes": 17824,
          "ratio": 0.020214277694547114,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277659,
          "duplicatedBytes": 0,
          "ratio": 0.3148943071358986,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17824,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881753,
        "estimatedDeferrableBytes": 320297,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277659,
          "unusedCssSavings": 17824
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17824,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198305,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176045,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513575,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294395,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881753,
        "estimatedRedundantBytes": 295483,
        "redundancyRatio": 0.3351085848304457,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277659,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17824,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17824,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881753,
        "heavyRequestCount": 3,
        "heavyBytes": 492700,
        "heavyRatio": 0.5587732618998744,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198305,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "transferSize": 176045,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118350,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492700
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294395
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198305
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198305,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176045,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2022-01-05-civicactions-named-govtech-100-top-government-technology-companies-list/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2022-01-05-civicactions-named-govtech-100-top-government-technology-companies-list/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 880464,
      "co2Grams": 0.3372893817696,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294391,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Named to 2022 GovTech 100 Top Government Technology Companies List | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2022-01-05-civicactions-named-govtech-100-top-government-technology-companies-list/",
          "ogTitle": "CivicActions Named to 2022 GovTech 100 Top Government Technology Companies List | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2022-01-05-civicactions-named-govtech-100-top-government-technology-companies-list/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:32:08 GMT",
            "etag": "\"220ed265c46bd6d46bd53210b0c350bad6e06471c95df77115d8c7beb329eb1b-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706328.487747,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320020,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277637,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17569,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.13 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.16 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205693.75
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 880464,
        "css": {
          "unusedBytes": 17569,
          "ratio": 0.01995425139471915,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277637,
          "duplicatedBytes": 0,
          "ratio": 0.3153303258281997,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17569,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277637,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 880464,
        "estimatedDeferrableBytes": 320020,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277637,
          "unusedCssSavings": 17569
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277637,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17569,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198300,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176033,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513566,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294391,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 880464,
        "estimatedRedundantBytes": 295206,
        "redundancyRatio": 0.3352845772229188,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277637,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17569,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277637,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17569,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 880464,
        "heavyRequestCount": 3,
        "heavyBytes": 492691,
        "heavyRatio": 0.5595810845190717,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198300,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176033,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118358,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492691
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294391
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198300
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277637,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198300,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176033,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2021-09-08-civicactions-announces-ditap-grads-across-federal-agencies/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2021-09-08-civicactions-announces-ditap-grads-across-federal-agencies/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 882614,
      "co2Grams": 0.33811300677960004,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294438,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions announces 13 DITAP graduates across seven federal agencies | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2021-09-08-civicactions-announces-ditap-grads-across-federal-agencies/",
          "ogTitle": "CivicActions announces 13 DITAP graduates across seven federal agencies | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2021-09-08-civicactions-announces-ditap-grads-across-federal-agencies/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:32:17 GMT",
            "etag": "\"b983ef15eadab039466a986003398845b9673ab420f7a566c27cdd9454b74bf1-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706338.529765,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 335284,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277604,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 39662,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18018,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.60 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205700.45833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 882614,
        "css": {
          "unusedBytes": 18018,
          "ratio": 0.02041436007133356,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277604,
          "duplicatedBytes": 0,
          "ratio": 0.314524809259767,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18018,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277604,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 882614,
        "estimatedDeferrableBytes": 335284,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 39662,
          "unusedJavascriptSavings": 277604,
          "unusedCssSavings": 18018
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 39662,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277604,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18018,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198307,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176031,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513620,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294438,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 882614,
        "estimatedRedundantBytes": 295622,
        "redundancyRatio": 0.3349391693311006,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277604,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18018,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277604,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18018,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 882614,
        "heavyRequestCount": 3,
        "heavyBytes": 492745,
        "heavyRatio": 0.5582791571400408,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198307,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176031,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118407,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492745
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294438
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198307
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 39662,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277604,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198307,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176031,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 39 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 39 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.73,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2021-07-19-civicactions-announces-va-ditap-graduation/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2021-07-19-civicactions-announces-va-ditap-graduation/",
      "performanceScore": 0.92,
      "bestPracticesScore": 1,
      "transferBytes": 882118,
      "co2Grams": 0.3379229984052,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294406,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions announces 24 DITAP graduates from the Department of Veterans Affairs | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2021-07-19-civicactions-announces-va-ditap-graduation/",
          "ogTitle": "CivicActions announces 24 DITAP graduates from the Department of Veterans Affairs | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2021-07-19-civicactions-announces-va-ditap-graduation/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:32:26 GMT",
            "etag": "\"b43560ea7edf61f6f0119d09231d254afc66447d3fc1eab276c55d7e6eafc67b-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706347.531011,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320381,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277634,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17933,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.13 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.51 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205694.70833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 882118,
        "css": {
          "unusedBytes": 17933,
          "ratio": 0.0203294797294693,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277634,
          "duplicatedBytes": 0,
          "ratio": 0.3147356702844744,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17933,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277634,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 882118,
        "estimatedDeferrableBytes": 320381,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277634,
          "unusedCssSavings": 17933
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277634,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17933,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198301,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176032,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513582,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294406,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 882118,
        "estimatedRedundantBytes": 295567,
        "redundancyRatio": 0.3350651500139437,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277634,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17933,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277634,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17933,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 882118,
        "heavyRequestCount": 3,
        "heavyBytes": 492707,
        "heavyRatio": 0.5585499899106469,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198301,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176032,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118374,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492707
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294406
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198301
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277634,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198301,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176032,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2021-07-08-gsa-engages-civicactions-to-modernize-vpat/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2021-07-08-gsa-engages-civicactions-to-modernize-vpat/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 881706,
      "co2Grams": 0.3377651688684,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294415,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "GSA Engages CivicActions to Modernize VPAT to Improve Digital Accessibility | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2021-07-08-gsa-engages-civicactions-to-modernize-vpat/",
          "ogTitle": "GSA Engages CivicActions to Modernize VPAT to Improve Digital Accessibility | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2021-07-08-gsa-engages-civicactions-to-modernize-vpat/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:32:35 GMT",
            "etag": "\"1c2354e7700526888364de9735fdd135c6991cfa2955a5902a9b34a8b502cd73-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706356.728418,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320377,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277701,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17862,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.19 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.44 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205694.70833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881706,
        "css": {
          "unusedBytes": 17862,
          "ratio": 0.02025845349810481,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277701,
          "duplicatedBytes": 0,
          "ratio": 0.3149587277391784,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17862,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277701,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881706,
        "estimatedDeferrableBytes": 320377,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277701,
          "unusedCssSavings": 17862
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277701,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17862,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198301,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176057,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513591,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294415,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881706,
        "estimatedRedundantBytes": 295563,
        "redundancyRatio": 0.33521718123728317,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277701,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17862,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277701,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17862,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881706,
        "heavyRequestCount": 3,
        "heavyBytes": 492716,
        "heavyRatio": 0.5588211943663761,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198301,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176057,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118358,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492716
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294415
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198301
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277701,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198301,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176057,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.73,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2021-05-11-civicactions-wins-department-of-ed-recompete/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2021-05-11-civicactions-wins-department-of-ed-recompete/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 881286,
      "co2Grams": 0.3376042746804001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294437,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20874,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Department of Education awards CivicActions 5-year contract to advance adult literacy | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2021-05-11-civicactions-wins-department-of-ed-recompete/",
          "ogTitle": "Department of Education awards CivicActions 5-year contract to advance adult literacy | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2021-05-11-civicactions-wins-department-of-ed-recompete/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 30,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 30 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:32:44 GMT",
            "etag": "\"4effa4749887bb9d3424065bb064ab93460bfeff86a6c54f411d05b1ce7ba440-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706365.820094,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320163,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277602,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17747,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.33 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205693
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881286,
        "css": {
          "unusedBytes": 17747,
          "ratio": 0.02013761707323162,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277602,
          "duplicatedBytes": 0,
          "ratio": 0.3149964937602549,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17747,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881286,
        "estimatedDeferrableBytes": 320163,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277602,
          "unusedCssSavings": 17747
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17747,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198300,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176028,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513611,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294437,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20874,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881286,
        "estimatedRedundantBytes": 295349,
        "redundancyRatio": 0.33513411083348654,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277602,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17747,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17747,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881286,
        "heavyRequestCount": 3,
        "heavyBytes": 492737,
        "heavyRatio": 0.5591113441039571,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198300,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176028,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118409,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492737
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294437
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198300
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277602,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198300,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176028,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.73,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2021-05-03-civicactions-wins-nsf-recompete/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2021-05-03-civicactions-wins-nsf-recompete/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 881286,
      "co2Grams": 0.3376042746804001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294421,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20874,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "NSF awards CivicActions $44M contract for CMS support and improvement of federal science research website | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2021-05-03-civicactions-wins-nsf-recompete/",
          "ogTitle": "NSF awards CivicActions $44M contract for CMS support and improvement of federal science research website | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2021-05-03-civicactions-wins-nsf-recompete/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:32:53 GMT",
            "etag": "\"503dcaa3620eb259ba8b3c7475af490ecef7166017b80c724868fd75a711c1fa-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706374.897721,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 319780,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277172,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24814,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17794,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.68 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.38 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205699.70833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881286,
        "css": {
          "unusedBytes": 17794,
          "ratio": 0.020190948227930546,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277172,
          "duplicatedBytes": 0,
          "ratio": 0.31450857043003067,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17794,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881286,
        "estimatedDeferrableBytes": 319780,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24814,
          "unusedJavascriptSavings": 277172,
          "unusedCssSavings": 17794
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24814,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17794,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198307,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176061,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513602,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294421,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20874,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881286,
        "estimatedRedundantBytes": 294966,
        "redundancyRatio": 0.3346995186579612,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277172,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17794,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17794,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881286,
        "heavyRequestCount": 3,
        "heavyBytes": 492728,
        "heavyRatio": 0.559101131755185,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198307,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176061,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118360,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492728
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294421
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198307
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198307,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176061,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2020-11-09-civicactions-acquires-openconcept/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2020-11-09-civicactions-acquires-openconcept/",
      "performanceScore": 0.92,
      "bestPracticesScore": 1,
      "transferBytes": 881918,
      "co2Grams": 0.3378463821252,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294428,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198299,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Expands Accessibility Capabilities With OpenConcept | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2020-11-09-civicactions-acquires-openconcept/",
          "ogTitle": "CivicActions Expands Accessibility Capabilities With OpenConcept | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2020-11-09-civicactions-acquires-openconcept/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 34,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 34 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:02 GMT",
            "etag": "\"f4a221822d330b78c4d014635317197dc462b65a51d22626950e7f125b99612d-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706383.940424,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320338,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277610,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17913,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.49 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205692.7916666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881918,
        "css": {
          "unusedBytes": 17913,
          "ratio": 0.020311412172106705,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277610,
          "duplicatedBytes": 0,
          "ratio": 0.31477983213858884,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17913,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277610,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881918,
        "estimatedDeferrableBytes": 320338,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277610,
          "unusedCssSavings": 17913
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277610,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17913,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198299,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176064,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513602,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294428,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198299,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881918,
        "estimatedRedundantBytes": 295523,
        "redundancyRatio": 0.33509124431069554,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277610,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17913,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277610,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17913,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881918,
        "heavyRequestCount": 3,
        "heavyBytes": 492727,
        "heavyRatio": 0.5586993348587964,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198299,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176064,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118364,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492727
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294428
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198299
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277610,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198299,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176064,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2020-08-14-civicactions-certified-to-deliver-ditap/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2020-08-14-civicactions-certified-to-deliver-ditap/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 881913,
      "co2Grams": 0.3378444667182,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294422,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198313,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Certified to Deliver DITAP Training to Federal Acquisition Professionals | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2020-08-14-civicactions-certified-to-deliver-ditap/",
          "ogTitle": "CivicActions Certified to Deliver DITAP Training to Federal Acquisition Professionals | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2020-08-14-civicactions-certified-to-deliver-ditap/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:11 GMT",
            "etag": "\"63d5a4148109d9b4162ee4c3435d2116d0c33bc665831f2a2714712be449b627-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706392.898406,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320335,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277651,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17869,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.45 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205706.20833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881913,
        "css": {
          "unusedBytes": 17869,
          "ratio": 0.020261635784935703,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277651,
          "duplicatedBytes": 0,
          "ratio": 0.3148281066272977,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17869,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277651,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881913,
        "estimatedDeferrableBytes": 320335,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277651,
          "unusedCssSavings": 17869
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277651,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17869,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198313,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176056,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513610,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294422,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198313,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881913,
        "estimatedRedundantBytes": 295520,
        "redundancyRatio": 0.3350897424122334,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277651,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17869,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277651,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17869,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881913,
        "heavyRequestCount": 3,
        "heavyBytes": 492735,
        "heavyRatio": 0.5587115735905923,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198313,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176056,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492735
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294422
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198313
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277651,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198313,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176056,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.73,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2020-03-02-civicactions-wins-cms-contract/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2020-03-02-civicactions-wins-cms-contract/",
      "performanceScore": 0.91,
      "bestPracticesScore": 1,
      "transferBytes": 881307,
      "co2Grams": 0.3376123193898,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198309,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions Wins $18M Contract to Redesign, Migrate CMS Websites | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Press release from CivicActions",
          "robots": "",
          "canonical": "https://civicactions.com/press/2020-03-02-civicactions-wins-cms-contract/",
          "ogTitle": "CivicActions Wins $18M Contract to Redesign, Migrate CMS Websites | CivicActions",
          "ogDescription": "Press release from CivicActions",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2020-03-02-civicactions-wins-cms-contract/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:21 GMT",
            "etag": "\"de947858a420efe640291f24393c0d48d8e1ba6c79a3d0d656368649f58faae1-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706401.044098,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 319271,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 276691,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 270 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17765,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.21 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.35 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205702.375
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881307,
        "css": {
          "unusedBytes": 17765,
          "ratio": 0.02015756143999764,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 276691,
          "duplicatedBytes": 0,
          "ratio": 0.31395529594114197,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17765,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 276691,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881307,
        "estimatedDeferrableBytes": 319271,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 276691,
          "unusedCssSavings": 17765
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 276691,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17765,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198309,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513616,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198309,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881307,
        "estimatedRedundantBytes": 294456,
        "redundancyRatio": 0.3341128573811396,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 276691,
            "displayValue": "Est savings of 270 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17765,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 276691,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17765,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881307,
        "heavyRequestCount": 3,
        "heavyBytes": 492741,
        "heavyRatio": 0.5591025601748313,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198309,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176066,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492741
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294432
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198309
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 276691,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198309,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 270 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 270 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/",
      "performanceScore": 0.81,
      "bestPracticesScore": 1,
      "transferBytes": 882259,
      "co2Grams": 0.3379770128826,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294427,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198317,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Press | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "This work is worth talking about. Learn how we've been elevating government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/press/",
          "ogTitle": "Press | CivicActions",
          "ogDescription": "This work is worth talking about. Learn how we've been elevating government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:30 GMT",
            "etag": "\"b5685bcc3ab8ccae0df31efd9a45ad9010729bfc9c2d97cb2a1b56063630a02f-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706410.164887,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 334929,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277613,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 39663,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17653,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.24 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205710.0416666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.89 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.89 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 882259,
        "css": {
          "unusedBytes": 17653,
          "ratio": 0.020008863610345713,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277613,
          "duplicatedBytes": 0,
          "ratio": 0.3146615676349009,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17653,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 882259,
        "estimatedDeferrableBytes": 334929,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 39663,
          "unusedJavascriptSavings": 277613,
          "unusedCssSavings": 17653
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17653,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198317,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513619,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294427,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198317,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 882259,
        "estimatedRedundantBytes": 295266,
        "redundancyRatio": 0.3346704312452466,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277613,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17653,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17653,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 882259,
        "heavyRequestCount": 3,
        "heavyBytes": 492744,
        "heavyRatio": 0.5585026619167387,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198317,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176066,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118361,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492744
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294427
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198317
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277613,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198317,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.44,
          "displayValue": "4.2 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 4.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 39 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 39 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/2/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/2/",
      "performanceScore": 0.92,
      "bestPracticesScore": 1,
      "transferBytes": 882384,
      "co2Grams": 0.3380248980576,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198309,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Press | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "This work is worth talking about. Learn how we've been elevating government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/press/2/",
          "ogTitle": "Press | CivicActions",
          "ogDescription": "This work is worth talking about. Learn how we've been elevating government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/2/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 32,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 32 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:39 GMT",
            "etag": "\"21dbfa94a314bfb89039cb4ff7f94ad9f908efde2a503000fbde0f6f7f771210-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706419.166663,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 335050,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277705,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 39663,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17682,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.20 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.27 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205702.375
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 882384,
        "css": {
          "unusedBytes": 17682,
          "ratio": 0.020038894630908993,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277705,
          "duplicatedBytes": 0,
          "ratio": 0.3147212551451522,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17682,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277705,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 882384,
        "estimatedDeferrableBytes": 335050,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 39663,
          "unusedJavascriptSavings": 277705,
          "unusedCssSavings": 17682
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277705,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17682,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198309,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513616,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198309,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 882384,
        "estimatedRedundantBytes": 295387,
        "redundancyRatio": 0.3347601497760612,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277705,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17682,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277705,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17682,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 882384,
        "heavyRequestCount": 3,
        "heavyBytes": 492741,
        "heavyRatio": 0.5584201436109449,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198309,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176066,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492741
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294432
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198309
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277705,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198309,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 39 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 39 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/press/3/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/press/3/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 881717,
      "co2Grams": 0.3377693827638,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294458,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Press | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "This work is worth talking about. Learn how we've been elevating government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/press/3/",
          "ogTitle": "Press | CivicActions",
          "ogDescription": "This work is worth talking about. Learn how we've been elevating government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/press/3/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:48 GMT",
            "etag": "\"31c5dc461af552e3ed2a07432092ee20bee5e9525a63e1d55a53edb371d5896a-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706428.182715,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 319606,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277172,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17619,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.68 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.21 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205698.5416666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 881717,
        "css": {
          "unusedBytes": 17619,
          "ratio": 0.019982602127439984,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277172,
          "duplicatedBytes": 0,
          "ratio": 0.3143548326730686,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17619,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 881717,
        "estimatedDeferrableBytes": 319606,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277172,
          "unusedCssSavings": 17619
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17619,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198305,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176042,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513638,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294458,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 881717,
        "estimatedRedundantBytes": 294791,
        "redundancyRatio": 0.33433743480050854,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277172,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17619,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17619,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 881717,
        "heavyRequestCount": 3,
        "heavyBytes": 492763,
        "heavyRatio": 0.5588675277895289,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198305,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176042,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118416,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492763
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294458
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198305
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198305,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176042,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/accessibility-statement/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/accessibility-statement/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 885059,
      "co2Grams": 0.3390496408026,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Accessibility Statement | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We never stop working to make digital products and government services accessible to people of all abilities. Learn how this applies to our own website.",
          "robots": "",
          "canonical": "https://civicactions.com/accessibility-statement/",
          "ogTitle": "Accessibility Statement | CivicActions",
          "ogDescription": "We never stop working to make digital products and government services accessible to people of all abilities. Learn how this applies to our own website.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/accessibility-statement/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 37,
          "tabletSmallTapTargets": 38,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 37,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 38,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 37 small targets on mobile and 38 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:33:57 GMT",
            "etag": "\"b5466816d391d4effb4694aa2b9ea5a6b38fae485fcaf492da222dd824bcc6b2-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706438.523423,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320689,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277614,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18260,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.83 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205703.33333333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 885059,
        "css": {
          "unusedBytes": 18260,
          "ratio": 0.02063139293538623,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277614,
          "duplicatedBytes": 0,
          "ratio": 0.313667224444924,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18260,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 885059,
        "estimatedDeferrableBytes": 320689,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277614,
          "unusedCssSavings": 18260
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18260,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198310,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513617,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294432,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 885059,
        "estimatedRedundantBytes": 295874,
        "redundancyRatio": 0.33429861738031025,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277614,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18260,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18260,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 885059,
        "heavyRequestCount": 3,
        "heavyBytes": 492742,
        "heavyRatio": 0.5567335059018664,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198310,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176066,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492742
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294432
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198310
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277614,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198310,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176066,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/services/ditap/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/services/ditap/",
      "performanceScore": 0.87,
      "bestPracticesScore": 0.93,
      "transferBytes": 1809723,
      "co2Grams": 0.6932712204522001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294424,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 90,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 0,
        "components": [
          {
            "signature": "no-form|select|select|tabs|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "tabs",
            "formContext": "no-form",
            "hasLabel": false,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 90,
              "urgency": "high",
              "issues": [
                "Missing associated label",
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Add a programmatic label using <label>, aria-label, or aria-labelledby.",
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          }
        ],
        "recommendations": [
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We are a Small Business provider of DITAP training. Learn how we help you gain the skills for successful digital service procurements.",
          "robots": "",
          "canonical": "https://civicactions.com/services/ditap/",
          "ogTitle": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "ogDescription": "We are a Small Business provider of DITAP training. Learn how we help you gain the skills for successful digital service procurements.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/services/ditap/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 40,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 44,
          "tabletSmallTapTargets": 44,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 6,
          "mobileGridOverflowContainers": 1,
          "tabletGridOverflowContainers": 1,
          "gridOverflowContainers": 2,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 1
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0,
            "gridContainersDetected": 5,
            "gridOverflowContainers": 1
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 44 small targets on mobile and 44 on tablet."
          },
          {
            "title": "Make grid layouts breakpoint-aware",
            "urgency": "medium",
            "detail": "2 grid container(s) overflowed across tested viewports (1 on mobile, 1 on tablet). Use intrinsic tracks (minmax(), fr), wrapping, and breakpoint-aware grid templates."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:34:07 GMT",
            "etag": "\"bf199edee77a13de408110e9122d7f7e84211ba552878f8d8bf0fb5d94989b6d-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706448.672260,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 35,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 35
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "35 of 35 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 35,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/35 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 39,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 712189.5500000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 712189.5500000002,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 695.50 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2369003.5500000003,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 894111,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 873 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 712189.5500000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 695 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 468292,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 457 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277646,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 16765,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 16 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 873.16 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 695.50 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 457.32 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 16.37 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 915927.3333333335
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 894.46 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 894.46 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 7,
        "urgency": "high",
        "transferBytes": 1809723,
        "css": {
          "unusedBytes": 16765,
          "ratio": 0.009263848666342861,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277646,
          "duplicatedBytes": 0,
          "ratio": 0.1534190591598825,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 16765,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277646,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 22,
        "urgency": "high",
        "transferBytes": 1809723,
        "estimatedDeferrableBytes": 1188522,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 894111,
          "unusedJavascriptSavings": 277646,
          "unusedCssSavings": 16765
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 894111,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277646,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 16765,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 437769,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/kristen_jernigan_profile_civicactions_b2b2d6bc12/kristen_jernigan_profile_civicactions_b2b2d6bc12.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198310,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176061,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513609,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294424,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 9,
        "urgency": "medium",
        "transferBytes": 1809723,
        "estimatedRedundantBytes": 294411,
        "redundancyRatio": 0.16268290782622533,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277646,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 16765,
            "displayValue": "Est savings of 16 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277646,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 16765,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 45,
        "urgency": "high",
        "totalTransferBytes": 1809723,
        "heavyRequestCount": 5,
        "heavyBytes": 1239366,
        "heavyRatio": 0.6848374032932112,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/kristen_jernigan_profile_civicactions_b2b2d6bc12/kristen_jernigan_profile_civicactions_b2b2d6bc12.png",
            "transferSize": 437769,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/501x283_407fee16a9/501x283_407fee16a9.png",
            "transferSize": 308863,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198310,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176061,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118363,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 746632
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492734
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 746632
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294424
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198310
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 894111,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277646,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 437769,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/kristen_jernigan_profile_civicactions_b2b2d6bc12/kristen_jernigan_profile_civicactions_b2b2d6bc12.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198310,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.77,
          "displayValue": "3.0 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.0 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 16 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 16 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 695 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 695 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 873 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 873 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/careers/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/careers/",
      "performanceScore": 0.74,
      "bestPracticesScore": 0.79,
      "transferBytes": 3140615,
      "co2Grams": 1.203111191061,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "challenges.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 17713,
            "sampleUrl": "https://challenges.cloudflare.com/turnstile/v0/b/0b8fb825cb67/api.js",
            "greenCheck": {
              "hostname": "challenges.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:19",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/challenges.cloudflare.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 4,
          "greenCount": 4,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Careers | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Work for the public good. Join our diverse and talented team of civic-minded people.",
          "robots": "",
          "canonical": "https://civicactions.com/careers/",
          "ogTitle": "Careers | CivicActions",
          "ogDescription": "Work for the public good. Join our diverse and talented team of civic-minded people.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/careers/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 34,
          "tabletSmallTapTargets": 35,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 34 small targets on mobile and 35 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:34:20 GMT",
            "etag": "\"510339e0ebfed0e3eca690ffcd168ced1595ea76bccb9071f04fa67fc1a27df5-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706460.237707,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 35,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 35
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "35 of 35 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 35,
            "lazyImages": 0,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/35 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 40,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 1252242.6,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 1012316.6,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          },
          {
            "id": "uses-optimized-images",
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "estimatedSavingsBytes": 239926,
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 988.59 KB."
          },
          {
            "title": "Improve image encoding quality/size",
            "urgency": "high",
            "detail": "Re-encode oversized images and tune compression quality for significant byte savings. Estimated savings: 234.30 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 3436822.6,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 1306183,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,276 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 1012316.6,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 989 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 581368,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 568 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277477,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-optimized-images",
            "title": "Compress oversized image assets",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss.",
            "estimatedSavingsBytes": 239926,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 234 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-optimized-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 19552,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 19 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 1.25 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 988.59 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 567.74 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.97 KB."
          },
          {
            "title": "Compress oversized image assets",
            "urgency": "high",
            "detail": "Re-encode large images to reduce transfer weight without visible quality loss. Estimated byte savings: 234.30 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 19.09 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 206110.70833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 201.28 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 201.28 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 4,
        "urgency": "high",
        "transferBytes": 3140615,
        "css": {
          "unusedBytes": 19552,
          "ratio": 0.006225532260401227,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277477,
          "duplicatedBytes": 0,
          "ratio": 0.08835116688928761,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 19552,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277477,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 17,
        "urgency": "high",
        "transferBytes": 3140615,
        "estimatedDeferrableBytes": 1603212,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 1306183,
          "unusedJavascriptSavings": 277477,
          "unusedCssSavings": 19552
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 1306183,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277477,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 19552,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from civicactions.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 397130,
            "url": "https://civicactions.com/static/david-sumner-d07ae2466241fa3abe23fa8776f0deb4.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 56,
        "urgency": "medium",
        "providerCount": 4,
        "requestCount": 5,
        "transferBytes": 531322,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "challenges.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 17713,
            "sampleUrl": "https://challenges.cloudflare.com/turnstile/v0/b/0b8fb825cb67/api.js",
            "greenCheck": {
              "hostname": "challenges.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:19",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/challenges.cloudflare.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 4 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 5,
        "urgency": "medium",
        "transferBytes": 3140615,
        "estimatedRedundantBytes": 297029,
        "redundancyRatio": 0.09457669914968883,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277477,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 19552,
            "displayValue": "Est savings of 19 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277477,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 19552,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 51,
        "urgency": "high",
        "totalTransferBytes": 3140615,
        "heavyRequestCount": 10,
        "heavyBytes": 2400464,
        "heavyRatio": 0.7643292794564122,
        "heavyRequests": [
          {
            "url": "https://civicactions.com/static/david-sumner-d07ae2466241fa3abe23fa8776f0deb4.jpg",
            "transferSize": 397130,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "civicactions.com"
          },
          {
            "url": "https://civicactions.com/static/case-study-teaser-img-6-d1dccb8e44d9ff741a1ee46d8ab02411.png",
            "transferSize": 327249,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/flow/ov1/341676307:1776705261:XhaGbmbyh2jcePkdmC8EcE_iGGMhVq9GAVH_XtleYbA/9ef5e5f5aa159db4/XyzjsIUU9c2.hivcC42DJ8k38nZiGV6SPZ2.BDT3Ctk-1776706450-1.2.1.1-YNP8VpHIoVHGBJor34eToPIxUOVkdjEgpHvJJv9wXosazcMNjs_uhCEyBkIYRY3A",
            "transferSize": 302173,
            "resourceType": "xhr",
            "mimeType": "text/plain",
            "domain": "challenges.cloudflare.com"
          },
          {
            "url": "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/flow/ov1/341676307:1776705261:XhaGbmbyh2jcePkdmC8EcE_iGGMhVq9GAVH_XtleYbA/9ef5e5f63ba29db4/pEE.9RANvupSFWj17q7lFxTojj_LEI7._y_4YrD1SCQ-1776706450-1.2.1.1-Q9wS7cKwaMpY9w3wYotKFCIpY2l9QIDv1.KSWybxd0YB2i_MAYJux9OAw_QvQxsM",
            "transferSize": 278247,
            "resourceType": "xhr",
            "mimeType": "text/plain",
            "domain": "challenges.cloudflare.com"
          },
          {
            "url": "https://civicactions.com/static/case-study-teaser-img-7-6ef8480357c4d2d9fa102ba7c379125d.png",
            "transferSize": 267037,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://civicactions.com/static/family-photo-a4351522f28191359c8de36ec1eb88f1.png",
            "transferSize": 215841,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198301,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://civicactions.com/static/who-we-are-004d77a0dbf219b9686e68074651b775.png",
            "transferSize": 120053,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 5,
            "transferBytes": 1327310
          },
          {
            "resourceType": "xhr",
            "count": 2,
            "transferBytes": 580420
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492734
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "civicactions.com",
            "count": 5,
            "transferBytes": 1327310
          },
          {
            "domain": "challenges.cloudflare.com",
            "count": 2,
            "transferBytes": 580420
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294433
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198301
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 1306183,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277477,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from civicactions.com",
            "urgency": "high",
            "estimatedSavingsBytes": 397130,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://civicactions.com/static/david-sumner-d07ae2466241fa3abe23fa8776f0deb4.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy xhr asset from challenges.cloudflare.com",
            "urgency": "high",
            "estimatedSavingsBytes": 302173,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/flow/ov1/341676307:1776705261:XhaGbmbyh2jcePkdmC8EcE_iGGMhVq9GAVH_XtleYbA/9ef5e5f5aa159db4/XyzjsIUU9c2.hivcC42DJ8k38nZiGV6SPZ2.BDT3Ctk-1776706450-1.2.1.1-YNP8VpHIoVHGBJor34eToPIxUOVkdjEgpHvJJv9wXosazcMNjs_uhCEyBkIYRY3A",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.12,
          "displayValue": "6.1 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 6.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 989 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 989 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 19 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 19 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 234 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- Current value: Est savings of 234 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 1,276 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 1,276 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 3,067 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 3,067 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/",
      "performanceScore": 0.92,
      "bestPracticesScore": 1,
      "transferBytes": 15525263,
      "co2Grams": 5.9474394854082,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294439,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 50,
        "urgency": "medium",
        "pageElementOccurrences": 6,
        "uniqueElementsAssessed": 6,
        "reusedFromCacheCount": 0,
        "components": [
          {
            "signature": "no-form|input|checkbox|web_cms|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "web_cms",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "no-form|input|checkbox|it_service_modernization|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "it_service_modernization",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "no-form|input|checkbox|product_design|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "product_design",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "no-form|input|checkbox|security_compliance|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "security_compliance",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "no-form|input|checkbox|data_services|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "data_services",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "no-form|input|checkbox|workforce_development|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "workforce_development",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "6 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "6 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Case Studies | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "From large-scale federal CMS modernization to automating security compliance, see how we've helped government deliver better services to the public.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/",
          "ogTitle": "Case Studies | CivicActions",
          "ogDescription": "From large-scale federal CMS modernization to automating security compliance, see how we've helped government deliver better services to the public.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 35,
          "tabletSmallTapTargets": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 30,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0,
            "gridContainersDetected": 13,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0,
            "gridContainersDetected": 17,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 35 small targets on mobile and 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:34:38 GMT",
            "etag": "\"c8af595278d81051f2a89e37dba70fb1025d456fc828bce6aa4039d059670900-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706479.626264,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 31,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 31
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "31 of 31 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 31,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/31 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 19,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 2912193.6999999993,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 2912193.6999999993,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 2.78 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 17514457.7,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 14090121,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 13,760 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 2912193.6999999993,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 2,844 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277643,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 212776,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 208 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 21724,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 21 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 13.44 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 2.78 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 207.79 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 21.21 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 11918021.258333333
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 11.37 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 11.37 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 15525263,
        "css": {
          "unusedBytes": 21724,
          "ratio": 0.0013992677611967025,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277643,
          "duplicatedBytes": 0,
          "ratio": 0.0178833041346868,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 21724,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 15525263,
        "estimatedDeferrableBytes": 512143,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 212776,
          "unusedJavascriptSavings": 277643,
          "unusedCssSavings": 21724
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 212776,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 21724,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8792324,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198307,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513621,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294439,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 1,
        "urgency": "medium",
        "transferBytes": 15525263,
        "estimatedRedundantBytes": 299367,
        "redundancyRatio": 0.019282571895883505,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277643,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 21724,
            "displayValue": "Est savings of 21 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 21724,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 45,
        "urgency": "high",
        "totalTransferBytes": 15525263,
        "heavyRequestCount": 6,
        "heavyBytes": 14728747,
        "heavyRatio": 0.9486954906979675,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7.jpg",
            "transferSize": 8792324,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/priscilla_du_preez_O_Edk_Pax_YMXU_unsplash_2113b7ea76/priscilla_du_preez_O_Edk_Pax_YMXU_unsplash_2113b7ea76.jpg",
            "transferSize": 2968267,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/national_cancer_institute_N_Fvd_K_Ihx_Yl_U_unsplash_2_14a0696475/national_cancer_institute_N_Fvd_K_Ihx_Yl_U_unsplash_2_14a0696475.jpg",
            "transferSize": 2475410,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198307,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118377,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 14236001
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492746
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 3,
            "transferBytes": 14236001
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294439
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198307
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 212776,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 8792324,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 2,844 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 2,844 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.77,
          "displayValue": "3.0 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.0 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 21 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 21 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 208 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 208 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 15,161 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 15,161 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/contact/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/contact/",
      "performanceScore": 0.92,
      "bestPracticesScore": 1,
      "transferBytes": 1258559,
      "co2Grams": 0.4821305437026001,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294453,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198303,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "challenges.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 17772,
            "sampleUrl": "https://challenges.cloudflare.com/turnstile/v0/b/0b8fb825cb67/api.js",
            "greenCheck": {
              "hostname": "challenges.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:19",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/challenges.cloudflare.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 4,
          "greenCount": 4,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 27.5,
        "urgency": "low",
        "pageElementOccurrences": 4,
        "uniqueElementsAssessed": 4,
        "reusedFromCacheCount": 0,
        "components": [
          {
            "signature": "form|get|self|input|text|name|name|required|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "name",
            "formContext": "form|get|self",
            "hasLabel": true,
            "hasValidationRule": true,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 20,
              "urgency": "low",
              "issues": [
                "No error messaging hook"
              ],
              "recommendations": [
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "form|get|self|input|email|email|email|required|no-pattern|no-minlength",
            "role": "form",
            "controlType": "email",
            "fieldName": "email",
            "formContext": "form|get|self",
            "hasLabel": true,
            "hasValidationRule": true,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 20,
              "urgency": "low",
              "issues": [
                "No error messaging hook"
              ],
              "recommendations": [
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "form|get|self|input|text|organization|organization|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "text",
            "fieldName": "organization",
            "formContext": "form|get|self",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          },
          {
            "signature": "form|get|self|textarea|textarea|message|no-autocomplete|required|no-pattern|no-minlength",
            "role": "form",
            "controlType": "textarea",
            "fieldName": "message",
            "formContext": "form|get|self",
            "hasLabel": true,
            "hasValidationRule": true,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 20,
              "urgency": "low",
              "issues": [
                "No error messaging hook"
              ],
              "recommendations": [
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": false
          }
        ],
        "recommendations": [
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "4 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Contact | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Get in touch.",
          "robots": "",
          "canonical": "https://civicactions.com/contact/",
          "ogTitle": "Contact | CivicActions",
          "ogDescription": "Get in touch.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/contact/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:34:48 GMT",
            "etag": "\"f59fe3c1326c789445e32c01804ae4bae9f6360f7ad7e8419cc6e25334a23431-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706488.215635,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 15,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 15
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "15 of 15 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 15,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/15 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 321623,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277562,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 19246,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 19 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.06 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 18.79 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 207378.625
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 202.52 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 202.52 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 10,
        "urgency": "high",
        "transferBytes": 1258559,
        "css": {
          "unusedBytes": 19246,
          "ratio": 0.015292091987741537,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277562,
          "duplicatedBytes": 0,
          "ratio": 0.220539521786424,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 19246,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277562,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 8,
        "urgency": "medium",
        "transferBytes": 1258559,
        "estimatedDeferrableBytes": 321623,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277562,
          "unusedCssSavings": 19246
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277562,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 19246,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198303,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176042,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 56,
        "urgency": "medium",
        "providerCount": 4,
        "requestCount": 5,
        "transferBytes": 531403,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294453,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198303,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "challenges.cloudflare.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 17772,
            "sampleUrl": "https://challenges.cloudflare.com/turnstile/v0/b/0b8fb825cb67/api.js",
            "greenCheck": {
              "hostname": "challenges.cloudflare.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:19",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/challenges.cloudflare.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 4 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 1258559,
        "estimatedRedundantBytes": 296808,
        "redundancyRatio": 0.23583161377416553,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277562,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 19246,
            "displayValue": "Est savings of 19 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277562,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 19246,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 1258559,
        "heavyRequestCount": 4,
        "heavyBytes": 771463,
        "heavyRatio": 0.6129732495655746,
        "heavyRequests": [
          {
            "url": "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/flow/ov1/341676307:1776705261:XhaGbmbyh2jcePkdmC8EcE_iGGMhVq9GAVH_XtleYbA/9ef5e6b679ca9db4/p3MeW8ywSVWU73R1DdbUc1DNCXjirEkm1pGmWcteoIo-1776706481-1.2.1.1-a5.xyLE0tjH4CtmrZhKUSQuD0Dr1keBDwTV2F_KEo4j45FtfoWCrVM5QETM7Z6AX",
            "transferSize": 278707,
            "resourceType": "xhr",
            "mimeType": "text/plain",
            "domain": "challenges.cloudflare.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198303,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "transferSize": 176042,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118411,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492756
          },
          {
            "resourceType": "xhr",
            "count": 1,
            "transferBytes": 278707
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294453
          },
          {
            "domain": "challenges.cloudflare.com",
            "count": 1,
            "transferBytes": 278707
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198303
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277562,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy xhr asset from challenges.cloudflare.com",
            "urgency": "high",
            "estimatedSavingsBytes": 278707,
            "strategy": "Move this asset behind an explicit interaction, route boundary, or lazy-loading trigger.",
            "url": "https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/b/flow/ov1/341676307:1776705261:XhaGbmbyh2jcePkdmC8EcE_iGGMhVq9GAVH_XtleYbA/9ef5e6b679ca9db4/p3MeW8ywSVWU73R1DdbUc1DNCXjirEkm1pGmWcteoIo-1776706481-1.2.1.1-a5.xyLE0tjH4CtmrZhKUSQuD0Dr1keBDwTV2F_KEo4j45FtfoWCrVM5QETM7Z6AX",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198303,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176042,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64h1h2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 19 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 19 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/contracting/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/contracting/",
      "performanceScore": 0.88,
      "bestPracticesScore": 0.96,
      "transferBytes": 1006105,
      "co2Grams": 0.385420111947,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Contracting information | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We are a Small Business helping government agencies make digital services that build public trust. Learn about contracting with us.",
          "robots": "",
          "canonical": "https://civicactions.com/contracting/",
          "ogTitle": "Contracting information | CivicActions",
          "ogDescription": "We are a Small Business helping government agencies make digital services that build public trust. Learn about contracting with us.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/contracting/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 40,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 33,
          "tabletSmallTapTargets": 36,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 7,
          "mobileGridOverflowContainers": 1,
          "tabletGridOverflowContainers": 1,
          "gridOverflowContainers": 2,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0,
            "gridContainersDetected": 2,
            "gridOverflowContainers": 1
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0,
            "gridContainersDetected": 5,
            "gridOverflowContainers": 1
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 33 small targets on mobile and 36 on tablet."
          },
          {
            "title": "Make grid layouts breakpoint-aware",
            "urgency": "medium",
            "detail": "2 grid container(s) overflowed across tested viewports (1 on mobile, 1 on tablet). Use intrinsic tracks (minmax(), fr), wrapping, and breakpoint-aware grid templates."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:34:59 GMT",
            "etag": "\"0c3a1e98d8b2f76c6c14dd3f9d1e5dbe051e5d18108b303c1f22ad40888c0060-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706499.001755,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 35,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 35
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "35 of 35 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 35,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/35 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 394631,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277172,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 77644,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 76 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 39815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.68 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 75.82 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 38.88 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205694.70833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 14,
        "urgency": "high",
        "transferBytes": 1006105,
        "css": {
          "unusedBytes": 39815,
          "ratio": 0.039573404366343476,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277172,
          "duplicatedBytes": 0,
          "ratio": 0.2754901327396246,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 39815,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 12,
        "urgency": "medium",
        "transferBytes": 1006105,
        "estimatedDeferrableBytes": 394631,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 77644,
          "unusedJavascriptSavings": 277172,
          "unusedCssSavings": 39815
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 77644,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 39815,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198301,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176067,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from civicactions.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 61661,
            "url": "https://civicactions.com/0db8cd01cca3deb8bd37537fa08cfc5a116cc701-f133be84f311f1eab9b1.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513609,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198301,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 17,
        "urgency": "medium",
        "transferBytes": 1006105,
        "estimatedRedundantBytes": 316987,
        "redundancyRatio": 0.3150635371059681,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277172,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 39815,
            "displayValue": "Est savings of 39 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 39815,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 30,
        "urgency": "medium",
        "totalTransferBytes": 1006105,
        "heavyRequestCount": 3,
        "heavyBytes": 492734,
        "heavyRatio": 0.4897441121950492,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198301,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492734
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294433
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198301
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 77644,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277172,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198301,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176067,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 76 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 76 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.64,
          "displayValue": "3.5 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.5 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 39 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 39 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/feedback/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/feedback/",
      "performanceScore": 0.9,
      "bestPracticesScore": 0.79,
      "transferBytes": 5962048,
      "co2Grams": 2.2839496947072,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198306,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 155282,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3855,
            "sampleUrl": "https://fonts.googleapis.com/icon?family=Material+Icons+Extended",
            "greenCheck": {
              "hostname": "fonts.googleapis.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:29",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/fonts.googleapis.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 6,
          "greenCount": 6,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Feedback or update requests | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Bugs? Comments? Updates? We welcome your feedback and contributions to the site.",
          "robots": "",
          "canonical": "https://civicactions.com/feedback/",
          "ogTitle": "Feedback or update requests | CivicActions",
          "ogDescription": "Bugs? Comments? Updates? We welcome your feedback and contributions to the site.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/feedback/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 30,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 30 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 61,
        "urgency": "high",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 4,
          "externalScriptsWithoutIntegrity": 4,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:35:10 GMT",
            "etag": "\"8fe0c36a169aa3822925a7321e0e9b1e35296872e91bce539f1bd17c9091ee94-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706510.040729,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "4 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 319963,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277480,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17668,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.98 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.25 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 8,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 4,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "4 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 238531.19166666665
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.94 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.94 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 2,
        "urgency": "high",
        "transferBytes": 5962048,
        "css": {
          "unusedBytes": 17668,
          "ratio": 0.002963411230503344,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277480,
          "duplicatedBytes": 0,
          "ratio": 0.046541054349109566,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17668,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277480,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 2,
        "urgency": "medium",
        "transferBytes": 5962048,
        "estimatedDeferrableBytes": 319963,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277480,
          "unusedCssSavings": 17668
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277480,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17668,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.gstatic.com",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy font from fonts.gstatic.com",
            "area": "font",
            "urgency": "high",
            "estimatedSavingsBytes": 226419,
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 59,
        "urgency": "medium",
        "providerCount": 4,
        "requestCount": 6,
        "transferBytes": 1181311,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198306,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 4 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 3,
        "urgency": "medium",
        "transferBytes": 5962048,
        "estimatedRedundantBytes": 295148,
        "redundancyRatio": 0.04950446557961291,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277480,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17668,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277480,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17668,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 40,
        "urgency": "high",
        "totalTransferBytes": 5962048,
        "heavyRequestCount": 36,
        "heavyBytes": 4379759,
        "heavyRatio": 0.7346064640875082,
        "heavyRequests": [
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "transferSize": 627699,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "transferSize": 226419,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQlV131.woff2",
            "transferSize": 226318,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icqFg.woff2",
            "transferSize": 216686,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrOSAqFg.woff2",
            "transferSize": 216040,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198306,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=0/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=sy2q,sy2t,sy2u,sy5n,syc2,sydr,sydz,sye0,fmklff,QvB8bb,bCfhJc,N5Lqpc,sy8p,u9ZRK,pItcJd,yZuGp,sy2c,qTnoBf,NJ1rfe,sydw,sydy,gJzDyc,eFy6Rc,sy3f,sy6r,sy9a,sy9m,sy9p,sya6,syb1,sy9c,sy9h,syax,syaz,syb2,sy4k,sy6k,sya7,syar,syb6,p2tbsc,nV4ih,syb5,LxALBf,sy1c,m9oV,sy1f,sy3u,sy1r,sy22,RAnnUd,i5dxUd,sy1l,i5H9N,sy83,syc5,etBPYb,SU9Rsf,sy1e,sy1h,sy1p,sy84,syc6,sy4x,PHUIyb,qNG0Fc,syc7,syc8,syc9,sycb,sy6l,sy1d,syc3,ywOR5c,sycd,sych,EcW08c,wg1P6b,syca,sycc,syce,sycf,sycg,t8tqF,SM1lmd,syck,sycl,sybd,sybg,sycj,sycm,vofJp,QwQO1b,sya5,syau,sy6e,sy9g,syat,syay,syb0,syas,sy9d,syaq,QMSdQb,X16vkb,WdhPgc,Vnjw0c,sy4n,sy4o,sy4l,sy4p,Ibqgte,ok0nye,Hzqecd,Vp87Bf,JCrucd,DhgO0d,oZECf,sy3a,akEJMc,sy3b,sy3c,zG2TEe,sycz,fvFQfe,CNqcN,sbHRWb,syd6,TOfxwf,sydb,sy20,sy8m,sy8o,syak,syal,syao,sydc,syda,sydg,sydi,sye6,sye7,A2m8uc,sye1,sye2,sy1m,sy1n,sydt,sye3,sy55,sycp,sye4,sye5,cNHZjb,sy3d,sy3e,sy3n,lzHmAf,sy3k,sy3l,sy3m,sy3o,jjSbr,syd7,yUS4Lc,v4y9Mc,KOZzeb,KFVhZe,sy63,sy9t,syaw,xKXrob,sy62,sy64,sy6y,sy7y,sy9n,sy9u,syan,syav,DPwS9e,sydk,sydl,sydo,sydj,sydn,syaj,sydm,riEgMd,sydu,lSvzH,D8e5bc,j0HcBf,sycx,syd8,sydd,sydf,sydh,syde,RGrRJf,OkF2xb,sy9o,xmYr4,UmOCme,ID6c7,sye8,rmdjlf",
            "transferSize": 172803,
            "resourceType": "xhr",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "transferSize": 155282,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUBg.woff2",
            "transferSize": 142751,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR49_.woff2",
            "transferSize": 129826,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUBg.woff2",
            "transferSize": 126687,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI9_.woff2",
            "transferSize": 116644,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjRV6SIc.woff2",
            "transferSize": 105685,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9SIc.woff2",
            "transferSize": 100861,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9_oA.woff2",
            "transferSize": 100011,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ96F.woff2",
            "transferSize": 84939,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuqON8AA.woff2",
            "transferSize": 72824,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEls0qp6I.woff2",
            "transferSize": 72562,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 30,
            "transferBytes": 2931236
          },
          {
            "resourceType": "script",
            "count": 4,
            "transferBytes": 1120438
          },
          {
            "resourceType": "xhr",
            "count": 1,
            "transferBytes": 172803
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 155282
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "fonts.gstatic.com",
            "count": 30,
            "transferBytes": 2931236
          },
          {
            "domain": "www.gstatic.com",
            "count": 3,
            "transferBytes": 955784
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294433
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198306
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277480,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.gstatic.com",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy font asset from fonts.gstatic.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 226419,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 24 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 5,822 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 5,822 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/",
      "performanceScore": 0.75,
      "bestPracticesScore": 1,
      "transferBytes": 1957672,
      "co2Grams": 0.7499477305008002,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294428,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198319,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Home | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/",
          "ogTitle": "Home | CivicActions",
          "ogDescription": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 40,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 16,
          "mobileGridOverflowContainers": 1,
          "tabletGridOverflowContainers": 1,
          "gridOverflowContainers": 2,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 6,
            "gridOverflowContainers": 1
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 10,
            "gridOverflowContainers": 1
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 29 on tablet."
          },
          {
            "title": "Make grid layouts breakpoint-aware",
            "urgency": "medium",
            "detail": "2 grid container(s) overflowed across tested viewports (1 on mobile, 1 on tablet). Use intrinsic tracks (minmax(), fr), wrapping, and breakpoint-aware grid templates."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:35:22 GMT",
            "etag": "\"b704c5d727241e25be1423d141f04ff5509c1fe260226ae7658a82902cbcea5d-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706522.285664,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 49,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 48,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 47
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "47 of 48 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 48,
            "lazyImages": 1,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/48 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 35,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 680771.0500000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 680771.0500000002,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 664.82 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2003837.0500000003,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 772892,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 755 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 680771.0500000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 665 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277656,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 237166,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 232 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 35352,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 35 KiB",
            "urgency": "medium",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 754.78 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 664.82 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 231.61 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "medium",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 34.52 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 304288.75833333336
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 297.16 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 297.16 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 7,
        "urgency": "high",
        "transferBytes": 1957672,
        "css": {
          "unusedBytes": 35352,
          "ratio": 0.018058183393336574,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277656,
          "duplicatedBytes": 0,
          "ratio": 0.14182968341989874,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 35352,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 18,
        "urgency": "high",
        "transferBytes": 1957672,
        "estimatedDeferrableBytes": 1085900,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 772892,
          "unusedJavascriptSavings": 277656,
          "unusedCssSavings": 35352
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 772892,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 35352,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from civicactions.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 349995,
            "url": "https://civicactions.com/static/case-study-teaser-img-8-918719e20c7d2c15cc2e895f1212eaa5.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198319,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513622,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294428,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198319,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 9,
        "urgency": "medium",
        "transferBytes": 1957672,
        "estimatedRedundantBytes": 313008,
        "redundancyRatio": 0.1598878668132353,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277656,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 35352,
            "displayValue": "Est savings of 35 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 35352,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 44,
        "urgency": "high",
        "totalTransferBytes": 1957672,
        "heavyRequestCount": 7,
        "heavyBytes": 1307130,
        "heavyRatio": 0.6676961206984623,
        "heavyRequests": [
          {
            "url": "https://civicactions.com/static/case-study-teaser-img-8-918719e20c7d2c15cc2e895f1212eaa5.png",
            "transferSize": 349995,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://civicactions.com/static/homepage-hero-2ed94da805a18e4d201fd4a0f0fafe4a.png",
            "transferSize": 200438,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198319,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://civicactions.com/static/blogpostimage-135ff8380b5746c8c7f83ced512babd9.png",
            "transferSize": 151321,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://civicactions.com/static/case-study-teaser-img-3-149e6f4d9f31d787f3a9d94dc85a0cae.png",
            "transferSize": 112629,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "civicactions.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 4,
            "transferBytes": 814383
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492747
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "civicactions.com",
            "count": 4,
            "transferBytes": 814383
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294428
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198319
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 772892,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from civicactions.com",
            "urgency": "high",
            "estimatedSavingsBytes": 349995,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://civicactions.com/static/case-study-teaser-img-8-918719e20c7d2c15cc2e895f1212eaa5.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198319,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.12,
          "displayValue": "6.1 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 6.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 665 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 665 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 755 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 755 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 35 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 35 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/licensing/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/licensing/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 854398,
      "co2Grams": 0.3273039819972,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294442,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Licensing policy | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Open source is just the beginning. Our open licensing policies allow our company to thrive while helping others to do the same.",
          "robots": "",
          "canonical": "https://civicactions.com/licensing/",
          "ogTitle": "Licensing policy | CivicActions",
          "ogDescription": "Open source is just the beginning. Our open licensing policies allow our company to thrive while helping others to do the same.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/licensing/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:35:31 GMT",
            "etag": "\"3a384d39a0ff9bd5c624f36af2e0d810d62c9abef20f2c1b8b667bd43ccf7464-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706531.265005,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320255,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277659,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17781,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.36 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205693.75
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 854398,
        "css": {
          "unusedBytes": 17781,
          "ratio": 0.020811144220843212,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277659,
          "duplicatedBytes": 0,
          "ratio": 0.3249761820603513,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17781,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 854398,
        "estimatedDeferrableBytes": 320255,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277659,
          "unusedCssSavings": 17781
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17781,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198300,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176061,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513617,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294442,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198300,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 19,
        "urgency": "medium",
        "transferBytes": 854398,
        "estimatedRedundantBytes": 295440,
        "redundancyRatio": 0.34578732628119446,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277659,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17781,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17781,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 854398,
        "heavyRequestCount": 3,
        "heavyBytes": 492742,
        "heavyRatio": 0.5767124923045231,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198300,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "transferSize": 176061,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118381,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492742
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294442
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198300
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277659,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198300,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176061,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 24 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/privacy/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/privacy/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 856734,
      "co2Grams": 0.3281988601476,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294441,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Privacy policy | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/privacy/",
          "ogTitle": "Privacy policy | CivicActions",
          "ogDescription": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/privacy/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:35:40 GMT",
            "etag": "\"d012dea3fc98e4d77f5047a479f5d74541375fb3c0a0050022523644117d438a-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706541.760079,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 335432,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277606,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 39663,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18163,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.10 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.74 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205703.33333333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 856734,
        "css": {
          "unusedBytes": 18163,
          "ratio": 0.021200279199844994,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277606,
          "duplicatedBytes": 0,
          "ratio": 0.3240282281314854,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18163,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277606,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 12,
        "urgency": "medium",
        "transferBytes": 856734,
        "estimatedDeferrableBytes": 335432,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 39663,
          "unusedJavascriptSavings": 277606,
          "unusedCssSavings": 18163
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277606,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18163,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198310,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176059,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513626,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294441,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 19,
        "urgency": "medium",
        "transferBytes": 856734,
        "estimatedRedundantBytes": 295769,
        "redundancyRatio": 0.34522850733133037,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277606,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18163,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277606,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18163,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 856734,
        "heavyRequestCount": 3,
        "heavyBytes": 492751,
        "heavyRatio": 0.5751505134615879,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198310,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176059,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118382,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492751
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294441
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198310
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277606,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198310,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176059,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 39 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 39 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/services/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/services/",
      "performanceScore": 0.9,
      "bestPracticesScore": 1,
      "transferBytes": 889377,
      "co2Grams": 0.3407037862878,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294443,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198316,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Services | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/services/",
          "ogTitle": "Services | CivicActions",
          "ogDescription": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/services/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:35:50 GMT",
            "etag": "\"3f9456a64d13a6683c4ed0ca4d540c24ac276f5969f5f667fb036b5030a7b577-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706551.536785,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 18,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 18
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "18 of 18 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 18,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/18 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 344992,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277612,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 45625,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 45 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 21755,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 21 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.11 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 44.56 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 21.25 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205709.08333333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.89 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.89 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 889377,
        "css": {
          "unusedBytes": 21755,
          "ratio": 0.024460942884738417,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277612,
          "duplicatedBytes": 0,
          "ratio": 0.31214209497209844,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 21755,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277612,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 12,
        "urgency": "medium",
        "transferBytes": 889377,
        "estimatedDeferrableBytes": 344992,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 45625,
          "unusedJavascriptSavings": 277612,
          "unusedCssSavings": 21755
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 45625,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277612,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 21755,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198316,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513634,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294443,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198316,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 19,
        "urgency": "medium",
        "transferBytes": 889377,
        "estimatedRedundantBytes": 299367,
        "redundancyRatio": 0.3366030378568369,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277612,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 21755,
            "displayValue": "Est savings of 21 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277612,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 21755,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 889377,
        "heavyRequestCount": 3,
        "heavyBytes": 492759,
        "heavyRatio": 0.5540496324955558,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198316,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118381,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492759
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294443
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198316
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 45625,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277612,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198316,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 45 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 45 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 21 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 21 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/services2/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/services2/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 847204,
      "co2Grams": 0.3245480944056,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294435,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198302,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions | Open and Agile Digital Government Services | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/services2/",
          "ogTitle": "CivicActions | Open and Agile Digital Government Services | CivicActions",
          "ogDescription": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/services2/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:00 GMT",
            "etag": "\"9d9472c01c894346a94aecf421959b8d40bef462ee9516138dd9dff8e01ed996-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706560.046994,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 314376,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277656,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 18659,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18061,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.15 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 18.22 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.64 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205695.6666666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 847204,
        "css": {
          "unusedBytes": 18061,
          "ratio": 0.021318360158828334,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277656,
          "duplicatedBytes": 0,
          "ratio": 0.32773216368194674,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18061,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 847204,
        "estimatedDeferrableBytes": 314376,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 18659,
          "unusedJavascriptSavings": 277656,
          "unusedCssSavings": 18061
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 18659,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18061,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198302,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176067,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513612,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294435,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198302,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 19,
        "urgency": "medium",
        "transferBytes": 847204,
        "estimatedRedundantBytes": 295717,
        "redundancyRatio": 0.34905052384077506,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277656,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18061,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18061,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 847204,
        "heavyRequestCount": 3,
        "heavyBytes": 492737,
        "heavyRatio": 0.5816037223620285,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198302,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118368,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492737
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294435
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198302
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277656,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198302,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176067,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 18 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 18 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.73,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/styles/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/styles/",
      "performanceScore": 0.93,
      "bestPracticesScore": 1,
      "transferBytes": 848390,
      "co2Grams": 0.325002428946,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294441,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198299,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "CivicActions | Open and Agile Digital Government Services | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "robots": "",
          "canonical": "https://civicactions.com/styles/",
          "ogTitle": "CivicActions | Open and Agile Digital Government Services | CivicActions",
          "ogDescription": "We use Agile and DevOps, open source software, and human-centered design to elevate government digital services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/styles/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:09 GMT",
            "etag": "\"4960c309a790b091f3f7d8488bf9b5de0fd1eb71882ce0aaa1fb6b6035ccf968-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706569.280516,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 314580,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277643,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 18659,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18278,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 18.22 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.85 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205692.7916666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.87 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 848390,
        "css": {
          "unusedBytes": 18278,
          "ratio": 0.021544336920520043,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277643,
          "duplicatedBytes": 0,
          "ratio": 0.3272586899892738,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18278,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 848390,
        "estimatedDeferrableBytes": 314580,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 18659,
          "unusedJavascriptSavings": 277643,
          "unusedCssSavings": 18278
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 18659,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18278,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198299,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513615,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294441,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198299,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 19,
        "urgency": "medium",
        "transferBytes": 848390,
        "estimatedRedundantBytes": 295921,
        "redundancyRatio": 0.34880302690979387,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277643,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18278,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18278,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 848390,
        "heavyRequestCount": 3,
        "heavyBytes": 492740,
        "heavyRatio": 0.580794210209927,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198299,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118379,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492740
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294441
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198299
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277643,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198299,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 18 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 18 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.2 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/sustainability/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/sustainability/",
      "performanceScore": 0.91,
      "bestPracticesScore": 1,
      "transferBytes": 889578,
      "co2Grams": 0.34078078564920006,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294446,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Sustainability | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "The team at CivicActions understands the importance of building environmentally sustainable digital products and services.",
          "robots": "",
          "canonical": "https://civicactions.com/sustainability/",
          "ogTitle": "Sustainability | CivicActions",
          "ogDescription": "The team at CivicActions understands the importance of building environmentally sustainable digital products and services.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/sustainability/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 33,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 33,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 33 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:18 GMT",
            "etag": "\"497fba8179fd7dcd8434b914df976d80183370c91760b42481f0ddd2393c7c0e-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706578.242157,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 46,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 14,
          "imagesWithLazy": 1,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 14 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 14,
            "lazyImages": 1,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 1/14 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 335543,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277644,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 39663,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 39 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18236,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 38.73 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.81 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205698.5416666667
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 889578,
        "css": {
          "unusedBytes": 18236,
          "ratio": 0.020499607679146742,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277644,
          "duplicatedBytes": 0,
          "ratio": 0.3121075386306766,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18236,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 11,
        "urgency": "medium",
        "transferBytes": 889578,
        "estimatedDeferrableBytes": 335543,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 39663,
          "unusedJavascriptSavings": 277644,
          "unusedCssSavings": 18236
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18236,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198305,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176064,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513626,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294446,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 18,
        "urgency": "medium",
        "transferBytes": 889578,
        "estimatedRedundantBytes": 295880,
        "redundancyRatio": 0.3326071463098233,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277644,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18236,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18236,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 32,
        "urgency": "medium",
        "totalTransferBytes": 889578,
        "heavyRequestCount": 3,
        "heavyBytes": 492751,
        "heavyRatio": 0.5539154520458015,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198305,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176064,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118382,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492751
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294446
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198305
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 39663,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198305,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176064,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 39 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 39 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/team/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/team/",
      "performanceScore": 0.88,
      "bestPracticesScore": 1,
      "transferBytes": 1175816,
      "co2Grams": 0.45043323942240004,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294444,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198306,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Team | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Meet the humans of CivicActions.",
          "robots": "",
          "canonical": "https://civicactions.com/team/",
          "ogTitle": "Team | CivicActions",
          "ogDescription": "Meet the humans of CivicActions.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/team/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:30 GMT",
            "etag": "\"4754f1a38c7679213d26330527a0750a6d88979681d28304cae3064b3c327623-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706591.970903,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 31,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 365,
          "imagesWithLazy": 117,
          "imagesWithoutLazy": 248
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "248 of 365 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 365,
            "lazyImages": 117,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 117/365 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 363972,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277167,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 51108,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 50 KiB",
            "urgency": "medium",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 21528,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 21 KiB",
            "urgency": "low",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 14169,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 14 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.67 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "medium",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 49.91 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "low",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 21.02 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 13.84 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 205699.5
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 200.88 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 14,
        "urgency": "high",
        "transferBytes": 1175816,
        "css": {
          "unusedBytes": 14169,
          "ratio": 0.012050354817420414,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277167,
          "duplicatedBytes": 0,
          "ratio": 0.23572310633636556,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0.125,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 14169,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277167,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 9,
        "urgency": "medium",
        "transferBytes": 1175816,
        "estimatedDeferrableBytes": 342444,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 51108,
          "unusedJavascriptSavings": 277167,
          "unusedCssSavings": 14169
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 51108,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277167,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 14169,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198306,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513625,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294444,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198306,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 24,
        "urgency": "medium",
        "transferBytes": 1175816,
        "estimatedRedundantBytes": 291336,
        "redundancyRatio": 0.24777346115378596,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277167,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 14169,
            "displayValue": "Est savings of 14 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277167,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 14169,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce DOM complexity and redundant markup",
            "urgency": "medium",
            "estimatedSavingsBytes": 0,
            "auditId": "dom-size",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 25,
        "urgency": "medium",
        "totalTransferBytes": 1175816,
        "heavyRequestCount": 3,
        "heavyBytes": 492750,
        "heavyRatio": 0.4190706709213006,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198306,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118382,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492750
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294444
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198306
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "medium",
            "estimatedSavingsBytes": 51108,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277167,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198306,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176062,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0,
          "displayValue": "Est savings of 50 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 50 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.66,
          "displayValue": "3.4 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.4 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 14 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 14 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoid an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": 0.5,
          "displayValue": "2,213 elements",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid an excessive DOM size\n\n- Lighthouse audit: dom-size\n- Current value: 2,213 elements\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/services/ditap/register/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/services/ditap/register/",
      "performanceScore": 0.91,
      "bestPracticesScore": 0.79,
      "transferBytes": 5965953,
      "co2Grams": 2.2854456275742003,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294423,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198308,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 155282,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3507,
            "sampleUrl": "https://fonts.googleapis.com/icon?family=Material+Icons+Extended",
            "greenCheck": {
              "hostname": "fonts.googleapis.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:29",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/fonts.googleapis.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 6,
          "greenCount": 6,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Register for the Digital IT Acquisition Professional (DITAP) certification program.",
          "robots": "",
          "canonical": "https://civicactions.com/services/ditap/register/",
          "ogTitle": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "ogDescription": "Register for the Digital IT Acquisition Professional (DITAP) certification program.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/services/ditap/register/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 61,
        "urgency": "high",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 4,
          "externalScriptsWithoutIntegrity": 4,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:42 GMT",
            "etag": "\"86a76683ef7208c28e3e64a2525013ebdf4950e285a013c6812ac703752142d3-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706602.243729,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "4 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320121,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277473,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17833,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.97 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.42 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 8,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 4,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "4 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 238533.10833333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.94 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.94 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 2,
        "urgency": "high",
        "transferBytes": 5965953,
        "css": {
          "unusedBytes": 17833,
          "ratio": 0.0029891284762048912,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277473,
          "duplicatedBytes": 0,
          "ratio": 0.0465094176906858,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17833,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277473,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 2,
        "urgency": "medium",
        "transferBytes": 5965953,
        "estimatedDeferrableBytes": 320121,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277473,
          "unusedCssSavings": 17833
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277473,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17833,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.gstatic.com",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy font from fonts.gstatic.com",
            "area": "font",
            "urgency": "high",
            "estimatedSavingsBytes": 226432,
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 59,
        "urgency": "medium",
        "providerCount": 4,
        "requestCount": 6,
        "transferBytes": 1181303,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294423,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198308,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 4 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 3,
        "urgency": "medium",
        "transferBytes": 5965953,
        "estimatedRedundantBytes": 295306,
        "redundancyRatio": 0.049498546166890686,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277473,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17833,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277473,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17833,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 40,
        "urgency": "high",
        "totalTransferBytes": 5965953,
        "heavyRequestCount": 36,
        "heavyBytes": 4382052,
        "heavyRatio": 0.7345099768637131,
        "heavyRequests": [
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "transferSize": 627699,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "transferSize": 226432,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQlV131.woff2",
            "transferSize": 226332,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icqFg.woff2",
            "transferSize": 216698,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrOSAqFg.woff2",
            "transferSize": 216044,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198308,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=0/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=sy2t,sy2u,sy5n,syc2,sydr,sydz,sye0,fmklff,QvB8bb,bCfhJc,N5Lqpc,sy8p,u9ZRK,pItcJd,yZuGp,sy2c,qTnoBf,NJ1rfe,sydw,sydy,gJzDyc,eFy6Rc,sy3f,sy6r,sy9a,sy9m,sy9p,sya6,syb1,sy9c,sy9h,syax,syaz,syb2,sy4k,sy6k,sya7,syar,syb6,p2tbsc,nV4ih,syb5,LxALBf,sy1c,m9oV,sy1f,sy3u,sy1r,sy22,RAnnUd,i5dxUd,sy1l,i5H9N,sy83,syc5,etBPYb,SU9Rsf,sy1e,sy1h,sy1p,sy84,syc6,sy4x,PHUIyb,qNG0Fc,syc7,syc8,syc9,sycb,sy6l,sy1d,syc3,ywOR5c,sycd,sych,EcW08c,wg1P6b,syca,sycc,syce,sycf,sycg,t8tqF,SM1lmd,syck,sycl,sybd,sybg,sycj,sycm,vofJp,QwQO1b,sya5,syau,sy6e,sy9g,syat,syay,syb0,syas,sy9d,syaq,QMSdQb,X16vkb,WdhPgc,Vnjw0c,sy4n,sy4o,sy4l,sy4p,Ibqgte,ok0nye,Hzqecd,Vp87Bf,JCrucd,DhgO0d,oZECf,sy3a,akEJMc,sy3b,sy3c,zG2TEe,sycz,fvFQfe,CNqcN,sbHRWb,syd6,TOfxwf,sydb,sy20,sy8m,sy8o,syak,syal,syao,sydc,syda,sydg,sydi,sye6,sye7,A2m8uc,sye1,sye2,sy1m,sy1n,sydt,sye3,sy55,sycp,sye4,sye5,cNHZjb,sy3d,sy3e,sy3n,lzHmAf,sy3k,sy3l,sy3m,sy3o,jjSbr,syd7,yUS4Lc,v4y9Mc,KOZzeb,KFVhZe,sy63,sy9t,syaw,xKXrob,sy62,sy64,sy6y,sy7y,sy9n,sy9u,syan,syav,DPwS9e,sydk,sydl,sydo,sydj,sydn,syaj,sydm,riEgMd,sydu,lSvzH,sydp,oCiKKc,D8e5bc,j0HcBf,sycx,syd8,sydd,sydf,sydh,syde,RGrRJf,OkF2xb,sy9o,xmYr4,UmOCme,ID6c7,sye8,rmdjlf",
            "transferSize": 174896,
            "resourceType": "xhr",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "transferSize": 155282,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUBg.woff2",
            "transferSize": 142764,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR49_.woff2",
            "transferSize": 129833,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUBg.woff2",
            "transferSize": 126699,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118361,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI9_.woff2",
            "transferSize": 116649,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjRV6SIc.woff2",
            "transferSize": 105689,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9SIc.woff2",
            "transferSize": 100865,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9_oA.woff2",
            "transferSize": 100011,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ96F.woff2",
            "transferSize": 84952,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuqON8AA.woff2",
            "transferSize": 72826,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEls0qp6I.woff2",
            "transferSize": 72566,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 30,
            "transferBytes": 2931444
          },
          {
            "resourceType": "script",
            "count": 4,
            "transferBytes": 1120430
          },
          {
            "resourceType": "xhr",
            "count": 1,
            "transferBytes": 174896
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 155282
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "fonts.gstatic.com",
            "count": 30,
            "transferBytes": 2931444
          },
          {
            "domain": "www.gstatic.com",
            "count": 3,
            "transferBytes": 957877
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294423
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198308
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277473,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.gstatic.com",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy font asset from fonts.gstatic.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 226432,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.74,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 24 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 5,826 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 5,826 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/manifest.webmanifest",
      "status": "ok",
      "finalUrl": "https://civicactions.com/manifest.webmanifest",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 80,
        "urgency": "high",
        "checks": {
          "hasTitle": false,
          "hasLang": false,
          "hasDescription": false,
          "hasCanonical": false,
          "hasOpenGraphCore": false,
          "hasTwitterCard": false,
          "hasViewport": false,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "",
          "lang": "",
          "charset": "utf-8",
          "viewport": "",
          "description": "",
          "robots": "",
          "canonical": "",
          "ogTitle": "",
          "ogDescription": "",
          "ogType": "",
          "ogUrl": "",
          "twitterCard": "",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Add document language metadata",
            "urgency": "high",
            "detail": "Set the html lang attribute for machine readability and localization tooling."
          },
          {
            "title": "Add canonical URL metadata",
            "urgency": "medium",
            "detail": "Use rel=canonical to reduce duplicate URL ambiguity for crawlers and tooling."
          },
          {
            "title": "Add meta description",
            "urgency": "medium",
            "detail": "Provide a concise description to improve machine interpretation and preview quality."
          },
          {
            "title": "Complete Open Graph metadata",
            "urgency": "medium",
            "detail": "Include og:title, og:description, og:type, and og:url for robust machine-readable sharing metadata."
          },
          {
            "title": "Add twitter:card metadata",
            "urgency": "low",
            "detail": "Include twitter card metadata to improve cross-platform machine-readable previews."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 0,
          "tabletSmallTapTargets": 0,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 0,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 980,
            "viewportHeight": 2121,
            "contentWidth": 980,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 0,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 980,
            "viewportHeight": 1411,
            "contentWidth": 980,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 0,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Layout adaptation looks healthy",
            "urgency": "low",
            "detail": "No major mobile or tablet layout issues were detected in this sample."
          }
        ]
      },
      "securityLight": {
        "score": 53,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 0,
          "externalScriptsWithoutIntegrity": 0,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:49 GMT",
            "etag": "\"8741ec5dcac3cf427e93f4adbc53bb823d36af3f45a5b3759e92ca23c9ffc7c4-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706609.051513,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasDarkMode": true,
          "hasMetaColorScheme": true,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 0,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 0
        },
        "recommendations": [
          {
            "title": "Media hints look healthy",
            "urgency": "low",
            "detail": "No major autoplay, dark mode, or lazy loading concerns were detected on this page."
          }
        ]
      },
      "wsgCustom": {
        "score": 60,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 0,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "\"Times New Roman\"",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 0,
            "scripts": []
          },
          "semantics": {
            "hasNavigation": false,
            "hasMainContent": false
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"\"Times New Roman\"\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "2.5",
            "title": "Missing explicit navigation structure",
            "urgency": "medium",
            "detail": "No <nav> or role=\"navigation\" tags found. Proper wayfinding helps users find content efficiently and reduces unnecessary page loads.",
            "wsid": "2.navigation wayfinding",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-that-navigation-and-wayfinding-are-well-structured",
            "assessor": "script",
            "example": "<nav aria-label=\"Primary\">\n  <ul>\n    <li><a href=\"/\">Home</a></li>\n  </ul>\n</nav>"
          },
          {
            "guideline": "3.7",
            "title": "Missing main content landmark",
            "urgency": "medium",
            "detail": "No <main> or role=\"main\" tags found. Semantic HTML reduces code bloat and allows both assistive technology and web crawlers to parse content more efficiently.",
            "wsid": "3.ensure code follows good semantic practices",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-code-follows-good-semantic-practices",
            "assessor": "script",
            "example": "<main>\n  <article>\n    <h1>Page Title</h1>\n    <p>Content goes here.</p>\n  </article>\n</main>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 0,
        "urgency": "low",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 0,
        "recommendations": [
          {
            "title": "No dependency maintenance warnings detected",
            "urgency": "low",
            "detail": "No vulnerable dependency flags were found for this page in the current lightweight checks."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/services/ditap",
      "status": "ok",
      "finalUrl": "https://civicactions.com/services/ditap/",
      "performanceScore": 0.78,
      "bestPracticesScore": 0.93,
      "transferBytes": 1810296,
      "co2Grams": 0.6934907260944,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294450,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 90,
        "urgency": "high",
        "pageElementOccurrences": 1,
        "uniqueElementsAssessed": 1,
        "reusedFromCacheCount": 1,
        "components": [
          {
            "signature": "no-form|select|select|tabs|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "select",
            "fieldName": "tabs",
            "formContext": "no-form",
            "hasLabel": false,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 90,
              "urgency": "high",
              "issues": [
                "Missing associated label",
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Add a programmatic label using <label>, aria-label, or aria-labelledby.",
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "title": "Missing associated label",
            "urgency": "high",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "1 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We are a Small Business provider of DITAP training. Learn how we help you gain the skills for successful digital service procurements.",
          "robots": "",
          "canonical": "https://civicactions.com/services/ditap/",
          "ogTitle": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "ogDescription": "We are a Small Business provider of DITAP training. Learn how we help you gain the skills for successful digital service procurements.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/services/ditap/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 40,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 44,
          "tabletSmallTapTargets": 44,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 6,
          "mobileGridOverflowContainers": 1,
          "tabletGridOverflowContainers": 1,
          "gridOverflowContainers": 2,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 1
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 44,
            "oversizedMedia": 0,
            "gridContainersDetected": 5,
            "gridOverflowContainers": 1
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 44 small targets on mobile and 44 on tablet."
          },
          {
            "title": "Make grid layouts breakpoint-aware",
            "urgency": "medium",
            "detail": "2 grid container(s) overflowed across tested viewports (1 on mobile, 1 on tablet). Use intrinsic tracks (minmax(), fr), wrapping, and breakpoint-aware grid templates."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:36:58 GMT",
            "etag": "\"bf199edee77a13de408110e9122d7f7e84211ba552878f8d8bf0fb5d94989b6d-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "14",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706619.880156,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 35,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 35
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "35 of 35 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 35,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/35 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 39,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 712189.5500000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 712189.5500000002,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 695.50 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 2369002.5500000003,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 894109,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 873 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 712189.5500000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 695 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 468292,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 457 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277652,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 16760,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 16 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 873.15 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 695.50 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 457.32 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 16.37 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 916147.6583333336
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 894.68 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 894.68 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 7,
        "urgency": "high",
        "transferBytes": 1810296,
        "css": {
          "unusedBytes": 16760,
          "ratio": 0.009258154467556687,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277652,
          "duplicatedBytes": 0,
          "ratio": 0.15337381290131558,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 16760,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277652,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 22,
        "urgency": "high",
        "transferBytes": 1810296,
        "estimatedDeferrableBytes": 1188521,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 894109,
          "unusedJavascriptSavings": 277652,
          "unusedCssSavings": 16760
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 894109,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277652,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 16760,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 437781,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/kristen_jernigan_profile_civicactions_b2b2d6bc12/kristen_jernigan_profile_civicactions_b2b2d6bc12.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198307,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176067,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513632,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294450,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 9,
        "urgency": "medium",
        "transferBytes": 1810296,
        "estimatedRedundantBytes": 294412,
        "redundancyRatio": 0.16263196736887228,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277652,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 16760,
            "displayValue": "Est savings of 16 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277652,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 16760,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 45,
        "urgency": "high",
        "totalTransferBytes": 1810296,
        "heavyRequestCount": 5,
        "heavyBytes": 1239413,
        "heavyRatio": 0.6846465992301811,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/kristen_jernigan_profile_civicactions_b2b2d6bc12/kristen_jernigan_profile_civicactions_b2b2d6bc12.png",
            "transferSize": 437781,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/501x283_407fee16a9/501x283_407fee16a9.png",
            "transferSize": 308875,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198307,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118383,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 746656
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492757
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 746656
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294450
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198307
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 894109,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277652,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 437781,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/kristen_jernigan_profile_civicactions_b2b2d6bc12/kristen_jernigan_profile_civicactions_b2b2d6bc12.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198307,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.47,
          "displayValue": "4.1 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 4.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 16 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 16 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 695 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 695 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 873 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 873 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/services/ditap/register",
      "status": "ok",
      "finalUrl": "https://civicactions.com/services/ditap/register/",
      "performanceScore": 0.87,
      "bestPracticesScore": 0.79,
      "transferBytes": 5966324,
      "co2Grams": 2.2855877507736,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294420,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198299,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 155282,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3507,
            "sampleUrl": "https://fonts.googleapis.com/icon?family=Material+Icons+Extended",
            "greenCheck": {
              "hostname": "fonts.googleapis.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:29",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/fonts.googleapis.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 6,
          "greenCount": 6,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Register for the Digital IT Acquisition Professional (DITAP) certification program.",
          "robots": "",
          "canonical": "https://civicactions.com/services/ditap/register/",
          "ogTitle": "Digital IT Acquisition Professional (DITAP) certification program | CivicActions",
          "ogDescription": "Register for the Digital IT Acquisition Professional (DITAP) certification program.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/services/ditap/register/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 29,
          "tabletSmallTapTargets": 28,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 28,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 29 small targets on mobile and 28 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 61,
        "urgency": "high",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 4,
          "externalScriptsWithoutIntegrity": 4,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:37:09 GMT",
            "etag": "\"86a76683ef7208c28e3e64a2525013ebdf4950e285a013c6812ac703752142d3-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "14",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706630.863505,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "4 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 320156,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277512,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17829,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.01 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.41 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 8,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 4,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "4 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 238524.48333333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.93 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.93 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 2,
        "urgency": "high",
        "transferBytes": 5966324,
        "css": {
          "unusedBytes": 17829,
          "ratio": 0.0029882721756310923,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277512,
          "duplicatedBytes": 0,
          "ratio": 0.046513062314416716,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17829,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277512,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 2,
        "urgency": "medium",
        "transferBytes": 5966324,
        "estimatedDeferrableBytes": 320156,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277512,
          "unusedCssSavings": 17829
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277512,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17829,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.gstatic.com",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy font from fonts.gstatic.com",
            "area": "font",
            "urgency": "high",
            "estimatedSavingsBytes": 226436,
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 59,
        "urgency": "medium",
        "providerCount": 4,
        "requestCount": 6,
        "transferBytes": 1181291,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294420,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198299,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 4 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 3,
        "urgency": "medium",
        "transferBytes": 5966324,
        "estimatedRedundantBytes": 295341,
        "redundancyRatio": 0.04950133449004781,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277512,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17829,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277512,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17829,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 40,
        "urgency": "high",
        "totalTransferBytes": 5966324,
        "heavyRequestCount": 36,
        "heavyBytes": 4382098,
        "heavyRatio": 0.7344720132530517,
        "heavyRequests": [
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "transferSize": 627699,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "transferSize": 226436,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQlV131.woff2",
            "transferSize": 226332,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icqFg.woff2",
            "transferSize": 216700,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrOSAqFg.woff2",
            "transferSize": 216045,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198299,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176057,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=0/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=sy2t,sy2u,sy5n,syc2,sydr,sydz,sye0,fmklff,QvB8bb,bCfhJc,N5Lqpc,sy8p,u9ZRK,pItcJd,yZuGp,sy2c,qTnoBf,NJ1rfe,sydw,sydy,gJzDyc,eFy6Rc,sy3f,sy6r,sy9a,sy9m,sy9p,sya6,syb1,sy9c,sy9h,syax,syaz,syb2,sy4k,sy6k,sya7,syar,syb6,p2tbsc,nV4ih,syb5,LxALBf,sy1c,m9oV,sy1f,sy3u,sy1r,sy22,RAnnUd,i5dxUd,sy1l,i5H9N,sy83,syc5,etBPYb,SU9Rsf,sy1e,sy1h,sy1p,sy84,syc6,sy4x,PHUIyb,qNG0Fc,syc7,syc8,syc9,sycb,sy6l,sy1d,syc3,ywOR5c,sycd,sych,EcW08c,wg1P6b,syca,sycc,syce,sycf,sycg,t8tqF,SM1lmd,syck,sycl,sybd,sybg,sycj,sycm,vofJp,QwQO1b,sya5,syau,sy6e,sy9g,syat,syay,syb0,syas,sy9d,syaq,QMSdQb,X16vkb,WdhPgc,Vnjw0c,sy4n,sy4o,sy4l,sy4p,Ibqgte,ok0nye,Hzqecd,Vp87Bf,JCrucd,DhgO0d,oZECf,sy3a,akEJMc,sy3b,sy3c,zG2TEe,sycz,fvFQfe,CNqcN,sbHRWb,syd6,TOfxwf,sydb,sy20,sy8m,sy8o,syak,syal,syao,sydc,syda,sydg,sydi,sye6,sye7,A2m8uc,sye1,sye2,sy1m,sy1n,sydt,sye3,sy55,sycp,sye4,sye5,cNHZjb,sy3d,sy3e,sy3n,lzHmAf,sy3k,sy3l,sy3m,sy3o,jjSbr,syd7,yUS4Lc,v4y9Mc,KOZzeb,KFVhZe,sy63,sy9t,syaw,xKXrob,sy62,sy64,sy6y,sy7y,sy9n,sy9u,syan,syav,DPwS9e,sydk,sydl,sydo,sydj,sydn,syaj,sydm,riEgMd,sydu,lSvzH,sydp,oCiKKc,D8e5bc,j0HcBf,sycx,syd8,sydd,sydf,sydh,syde,RGrRJf,OkF2xb,sy9o,xmYr4,UmOCme,ID6c7,sye8,rmdjlf",
            "transferSize": 174896,
            "resourceType": "xhr",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "transferSize": 155282,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUBg.woff2",
            "transferSize": 142768,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR49_.woff2",
            "transferSize": 129833,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUBg.woff2",
            "transferSize": 126699,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118363,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI9_.woff2",
            "transferSize": 116649,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjRV6SIc.woff2",
            "transferSize": 105689,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9SIc.woff2",
            "transferSize": 100865,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9_oA.woff2",
            "transferSize": 100015,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ96F.woff2",
            "transferSize": 84956,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuqON8AA.woff2",
            "transferSize": 72828,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEls0qp6I.woff2",
            "transferSize": 72567,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 30,
            "transferBytes": 2931502
          },
          {
            "resourceType": "script",
            "count": 4,
            "transferBytes": 1120418
          },
          {
            "resourceType": "xhr",
            "count": 1,
            "transferBytes": 174896
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 155282
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "fonts.gstatic.com",
            "count": 30,
            "transferBytes": 2931502
          },
          {
            "domain": "www.gstatic.com",
            "count": 3,
            "transferBytes": 957877
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294420
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198299
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277512,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.gstatic.com",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy font asset from fonts.gstatic.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 226436,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.69,
          "displayValue": "3.3 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.3 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 24 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 5,826 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 5,826 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks%20/",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/nyc-metro-transit-digital-clocks%20/",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:37:17 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706638.551511,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/cms-web-experience-services/fearless.tech",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/cms-web-experience-services/fearless.tech",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:37:24 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706645.620376,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/feedback",
      "status": "ok",
      "finalUrl": "https://civicactions.com/feedback/",
      "performanceScore": 0.84,
      "bestPracticesScore": 0.79,
      "transferBytes": 5960821,
      "co2Grams": 2.2834796538294,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294445,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.gstatic.com",
            "resourceType": "stylesheet",
            "requestCount": 1,
            "transferBytes": 155282,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          },
          {
            "hostname": "fonts.googleapis.com",
            "resourceType": "stylesheet",
            "requestCount": 3,
            "transferBytes": 3461,
            "sampleUrl": "https://fonts.googleapis.com/icon?family=Material+Icons+Extended",
            "greenCheck": {
              "hostname": "fonts.googleapis.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:29",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/fonts.googleapis.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 6,
          "greenCount": 6,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Feedback or update requests | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Bugs? Comments? Updates? We welcome your feedback and contributions to the site.",
          "robots": "",
          "canonical": "https://civicactions.com/feedback/",
          "ogTitle": "Feedback or update requests | CivicActions",
          "ogDescription": "Bugs? Comments? Updates? We welcome your feedback and contributions to the site.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/feedback/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 30,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 30 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 61,
        "urgency": "high",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 4,
          "externalScriptsWithoutIntegrity": 4,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:37:34 GMT",
            "etag": "\"8fe0c36a169aa3822925a7321e0e9b1e35296872e91bce539f1bd17c9091ee94-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "14",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706655.931951,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "4 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 12,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 12
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "12 of 12 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 12,
            "lazyImages": 0,
            "totalIframes": 1,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/12 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 319992,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277513,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 24815,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 24 KiB",
            "urgency": "low",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17664,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.01 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "low",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 24.23 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.25 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 8,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 4,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "4 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 238535.02500000002
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.94 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 232.94 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 2,
        "urgency": "high",
        "transferBytes": 5960821,
        "css": {
          "unusedBytes": 17664,
          "ratio": 0.002963350182802,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277513,
          "duplicatedBytes": 0,
          "ratio": 0.04655617070198887,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17664,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277513,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 2,
        "urgency": "medium",
        "transferBytes": 5960821,
        "estimatedDeferrableBytes": 319992,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 24815,
          "unusedJavascriptSavings": 277513,
          "unusedCssSavings": 17664
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 24815,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277513,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17664,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.gstatic.com",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy font from fonts.gstatic.com",
            "area": "font",
            "urgency": "high",
            "estimatedSavingsBytes": 226437,
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 59,
        "urgency": "medium",
        "providerCount": 4,
        "requestCount": 6,
        "transferBytes": 1181327,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.gstatic.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 667697,
            "sampleUrl": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "greenCheck": {
              "hostname": "www.gstatic.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:50",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.gstatic.com",
              "error": null
            }
          },
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294445,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198310,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 4 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 3,
        "urgency": "medium",
        "transferBytes": 5960821,
        "estimatedRedundantBytes": 295177,
        "redundancyRatio": 0.04951952088479087,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277513,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17664,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277513,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17664,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 40,
        "urgency": "high",
        "totalTransferBytes": 5960821,
        "heavyRequestCount": 36,
        "heavyBytes": 4380079,
        "heavyRatio": 0.7348113623945426,
        "heavyRequests": [
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "transferSize": 627699,
            "resourceType": "script",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "transferSize": 226437,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmQlV131.woff2",
            "transferSize": 226333,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDr3icqFg.woff2",
            "transferSize": 216701,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4D0qyriQwlOrhSvowK_l5UcA6zuSYEqOzpPe3HOZJ5eX1WtLaQwmYiScCmDxhtNOKl8yDrOSAqFg.woff2",
            "transferSize": 216045,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198310,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176062,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=0/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=sy2q,sy2t,sy2u,sy5n,syc2,sydr,sydz,sye0,fmklff,QvB8bb,bCfhJc,N5Lqpc,sy8p,u9ZRK,pItcJd,yZuGp,sy2c,qTnoBf,NJ1rfe,sydw,sydy,gJzDyc,eFy6Rc,sy3f,sy6r,sy9a,sy9m,sy9p,sya6,syb1,sy9c,sy9h,syax,syaz,syb2,sy4k,sy6k,sya7,syar,syb6,p2tbsc,nV4ih,syb5,LxALBf,sy1c,m9oV,sy1f,sy3u,sy1r,sy22,RAnnUd,i5dxUd,sy1l,i5H9N,sy83,syc5,etBPYb,SU9Rsf,sy1e,sy1h,sy1p,sy84,syc6,sy4x,PHUIyb,qNG0Fc,syc7,syc8,syc9,sycb,sy6l,sy1d,syc3,ywOR5c,sycd,sych,EcW08c,wg1P6b,syca,sycc,syce,sycf,sycg,t8tqF,SM1lmd,syck,sycl,sybd,sybg,sycj,sycm,vofJp,QwQO1b,sya5,syau,sy6e,sy9g,syat,syay,syb0,syas,sy9d,syaq,QMSdQb,X16vkb,WdhPgc,Vnjw0c,sy4n,sy4o,sy4l,sy4p,Ibqgte,ok0nye,Hzqecd,Vp87Bf,JCrucd,DhgO0d,oZECf,sy3a,akEJMc,sy3b,sy3c,zG2TEe,sycz,fvFQfe,CNqcN,sbHRWb,syd6,TOfxwf,sydb,sy20,sy8m,sy8o,syak,syal,syao,sydc,syda,sydg,sydi,sye6,sye7,A2m8uc,sye1,sye2,sy1m,sy1n,sydt,sye3,sy55,sycp,sye4,sye5,cNHZjb,sy3d,sy3e,sy3n,lzHmAf,sy3k,sy3l,sy3m,sy3o,jjSbr,syd7,yUS4Lc,v4y9Mc,KOZzeb,KFVhZe,sy63,sy9t,syaw,xKXrob,sy62,sy64,sy6y,sy7y,sy9n,sy9u,syan,syav,DPwS9e,sydk,sydl,sydo,sydj,sydn,syaj,sydm,riEgMd,sydu,lSvzH,D8e5bc,j0HcBf,sycx,syd8,sydd,sydf,sydh,syde,RGrRJf,OkF2xb,sy9o,xmYr4,UmOCme,ID6c7,sye8,rmdjlf",
            "transferSize": 172803,
            "resourceType": "xhr",
            "mimeType": "text/javascript",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://www.gstatic.com/_/freebird/_/ss/k=freebird.v.gVnKmeh2Ma8.L.W.O/am=AAAc/d=1/rs=AMjVe6gd2QLbpMSrTwgTFFnHPScpN7FNzw",
            "transferSize": 155282,
            "resourceType": "stylesheet",
            "mimeType": "text/css",
            "domain": "www.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-DPNUBg.woff2",
            "transferSize": 142769,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7dbR49_.woff2",
            "transferSize": 129838,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGDmQSNjdsmc35JDF1K5E55YMjF_7DPuGi-6_RUBg.woff2",
            "transferSize": 126702,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118383,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/ebgaramond/v32/SlGFmQSNjdsmc35JDF1K5GRwUjcdlttVFm-rI7e8QI9_.woff2",
            "transferSize": 116654,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjRV6SIc.woff2",
            "transferSize": 105690,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/caveat/v23/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9SIc.woff2",
            "transferSize": 100866,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/lobster/v32/neILzCirqoswsqX9_oA.woff2",
            "transferSize": 100016,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/pacifico/v23/FwZY7-Qmy14u9lezJ96F.woff2",
            "transferSize": 84957,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71XjywflP6FLr3gZx7K8UyEVQnyR1E7VN-f51xYuGCQepOvB0KLc2v0wKKB0Q4MSZxyqf2CgAchbDJ69BcVZxkDg-JuqON8AA.woff2",
            "transferSize": 72829,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          },
          {
            "url": "https://fonts.gstatic.com/s/robotoserif/v17/R71RjywflP6FLr3gZx7K8UyuXDs9zVwDmXCb8lxYgmuii32UGoVldX6UgfjL4-3sMM_kB_qXSEXTJQCFLH5-_bcEls0qp6I.woff2",
            "transferSize": 72567,
            "resourceType": "font",
            "mimeType": "font/woff2",
            "domain": "fonts.gstatic.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "font",
            "count": 30,
            "transferBytes": 2931540
          },
          {
            "resourceType": "script",
            "count": 4,
            "transferBytes": 1120454
          },
          {
            "resourceType": "xhr",
            "count": 1,
            "transferBytes": 172803
          },
          {
            "resourceType": "stylesheet",
            "count": 1,
            "transferBytes": 155282
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "fonts.gstatic.com",
            "count": 30,
            "transferBytes": 2931540
          },
          {
            "domain": "www.gstatic.com",
            "count": 3,
            "transferBytes": 955784
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294445
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198310
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277513,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.gstatic.com",
            "urgency": "high",
            "estimatedSavingsBytes": 627699,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.gstatic.com/_/freebird/_/js/k=freebird.v.en.cJrNEXw9OmM.O/am=AAAc/d=1/rs=AMjVe6hkmGMe3jXhMoVmU63r_4x08y84Qw/m=viewer_base",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy font asset from fonts.gstatic.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 226437,
            "strategy": "Subset or defer this font so full font payloads are only fetched when needed.",
            "url": "https://fonts.gstatic.com/s/merriweather/v33/u-4B0qyriQwlOrhSvowK_l5-eTxCVx0ZbwLvKH2Gk9hLmp0v5yA-xXPqCzLvPee1XYk_XSf-FmTCUF31.woff2",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.68,
          "displayValue": "3.3 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.3 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 24 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 24 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 5,821 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 5,821 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/",
      "performanceScore": 0.82,
      "bestPracticesScore": 1,
      "transferBytes": 15525657,
      "co2Grams": 5.9475904194798,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198303,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 50,
        "urgency": "medium",
        "pageElementOccurrences": 6,
        "uniqueElementsAssessed": 6,
        "reusedFromCacheCount": 6,
        "components": [
          {
            "signature": "no-form|input|checkbox|web_cms|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "web_cms",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|checkbox|it_service_modernization|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "it_service_modernization",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|checkbox|product_design|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "product_design",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|checkbox|security_compliance|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "security_compliance",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|checkbox|data_services|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "data_services",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          },
          {
            "signature": "no-form|input|checkbox|workforce_development|no-autocomplete|optional|no-pattern|no-minlength",
            "role": "form",
            "controlType": "checkbox",
            "fieldName": "workforce_development",
            "formContext": "no-form",
            "hasLabel": true,
            "hasValidationRule": false,
            "hasErrorMessagingHook": false,
            "toolingFriendly": true,
            "assessment": {
              "score": 50,
              "urgency": "medium",
              "issues": [
                "No explicit validation rule",
                "No error messaging hook"
              ],
              "recommendations": [
                "Define validation constraints (required, pattern, min/max, or semantic input type).",
                "Add aria-errormessage/aria-describedby and a visible error region for invalid input."
              ]
            },
            "reusedFromCache": true
          }
        ],
        "recommendations": [
          {
            "title": "No explicit validation rule",
            "urgency": "medium",
            "detail": "6 unique form control signature(s) on this page include this issue."
          },
          {
            "title": "No error messaging hook",
            "urgency": "medium",
            "detail": "6 unique form control signature(s) on this page include this issue."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Case Studies | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "From large-scale federal CMS modernization to automating security compliance, see how we've helped government deliver better services to the public.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/",
          "ogTitle": "Case Studies | CivicActions",
          "ogDescription": "From large-scale federal CMS modernization to automating security compliance, see how we've helped government deliver better services to the public.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 35,
          "tabletSmallTapTargets": 34,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 30,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 35,
            "oversizedMedia": 0,
            "gridContainersDetected": 13,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 34,
            "oversizedMedia": 0,
            "gridContainersDetected": 17,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 35 small targets on mobile and 34 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:37:47 GMT",
            "etag": "\"c8af595278d81051f2a89e37dba70fb1025d456fc828bce6aa4039d059670900-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "14",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706667.051886,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 31,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 31
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "31 of 31 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 31,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/31 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 19,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 2912193.6999999993,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 2912193.6999999993,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 2.78 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 17512867.7,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 14090121,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 13,760 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 2912193.6999999993,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 2,844 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 276055,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 270 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 212776,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 208 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 21722,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 21 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 13.44 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 2.78 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 269.58 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 207.79 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 21.21 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 11918141.225000001
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 11.37 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 11.37 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 15525657,
        "css": {
          "unusedBytes": 21722,
          "ratio": 0.0013991034324666583,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 276055,
          "duplicatedBytes": 0,
          "ratio": 0.01778056799786315,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 21722,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 276055,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 15525657,
        "estimatedDeferrableBytes": 510553,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 212776,
          "unusedJavascriptSavings": 276055,
          "unusedCssSavings": 21722
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 212776,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 276055,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 21722,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8792310,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198303,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513611,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294433,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198303,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 1,
        "urgency": "medium",
        "transferBytes": 15525657,
        "estimatedRedundantBytes": 297777,
        "redundancyRatio": 0.01917967143032981,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 276055,
            "displayValue": "Est savings of 270 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 21722,
            "displayValue": "Est savings of 21 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 276055,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 21722,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 45,
        "urgency": "high",
        "totalTransferBytes": 15525657,
        "heavyRequestCount": 6,
        "heavyBytes": 14728730,
        "heavyRatio": 0.9486703203606778,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7.jpg",
            "transferSize": 8792310,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/priscilla_du_preez_O_Edk_Pax_YMXU_unsplash_2113b7ea76/priscilla_du_preez_O_Edk_Pax_YMXU_unsplash_2113b7ea76.jpg",
            "transferSize": 2968273,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/national_cancer_institute_N_Fvd_K_Ihx_Yl_U_unsplash_2_14a0696475/national_cancer_institute_N_Fvd_K_Ihx_Yl_U_unsplash_2_14a0696475.jpg",
            "transferSize": 2475411,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198303,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118366,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 3,
            "transferBytes": 14235994
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492736
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 3,
            "transferBytes": 14235994
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294433
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198303
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 212776,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 276055,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 8792310,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7/adi_goldstein_E_Us_Vw_E_Osbl_E_unsplash_1_0665f4b3b7.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.41,
          "displayValue": "4.3 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 4.3 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 2,844 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 2,844 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 270 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 270 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 21 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 21 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 208 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 208 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 15,162 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 15,162 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/va-cms-modernization",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/va-cms-modernization/",
      "performanceScore": 0.66,
      "bestPracticesScore": 1,
      "transferBytes": 11736515,
      "co2Grams": 4.4960405973210005,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294438,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Helping Veterans access care and benefits online | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We joined the modernization effort at VA to implement a modern Drupal content management system and empower a Veteran-first approach to online healthcare.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/va-cms-modernization/",
          "ogTitle": "Helping Veterans access care and benefits online | CivicActions",
          "ogDescription": "We joined the modernization effort at VA to implement a modern Drupal content management system and empower a Veteran-first approach to online healthcare.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/va-cms-modernization/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 31,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 31 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:37:56 GMT",
            "etag": "\"bd056533b07e556edc5b8842f0806c60c069b3320802ce655bb661cf6e69a3b3-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "14",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706677.941536,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 42,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 23,
          "imagesWithLazy": 3,
          "imagesWithoutLazy": 20
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "20 of 23 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 23,
            "lazyImages": 3,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 3/23 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 73,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 8556885,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 8556885,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 8.16 MB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 19632440,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 8781049,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8,575 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 8556885,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 8,356 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 1999278,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 1,952 KiB",
            "urgency": "high",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277169,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 18059,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 18 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 8.37 MB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 8.16 MB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "high",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 1.91 MB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 270.67 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.64 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 8871086.058333334
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 8.46 MB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 8.46 MB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 1,
        "urgency": "high",
        "transferBytes": 11736515,
        "css": {
          "unusedBytes": 18059,
          "ratio": 0.0015387020763829808,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277169,
          "duplicatedBytes": 0,
          "ratio": 0.023615954139708423,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 18059,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 27,
        "urgency": "high",
        "transferBytes": 11736515,
        "estimatedDeferrableBytes": 9076277,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 8781049,
          "unusedJavascriptSavings": 277169,
          "unusedCssSavings": 18059
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8781049,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 18059,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 8748916,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_2_160c4ebf95/VA_2_160c4ebf95.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198307,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176067,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513620,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294438,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198307,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20875,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 1,
        "urgency": "medium",
        "transferBytes": 11736515,
        "estimatedRedundantBytes": 295228,
        "redundancyRatio": 0.025154656216091403,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277169,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 18059,
            "displayValue": "Est savings of 18 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 18059,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 59,
        "urgency": "high",
        "totalTransferBytes": 11736515,
        "heavyRequestCount": 5,
        "heavyBytes": 11324477,
        "heavyRatio": 0.9648926448779728,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_2_160c4ebf95/VA_2_160c4ebf95.png",
            "transferSize": 8748916,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_hero_46cae3d67f/VA_hero_46cae3d67f.png",
            "transferSize": 2082816,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198307,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176067,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118371,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 2,
            "transferBytes": 10831732
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492745
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 2,
            "transferBytes": 10831732
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294438
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198307
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 8781049,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277169,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 8748916,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/VA_2_160c4ebf95/VA_2_160c4ebf95.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198307,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0,
          "displayValue": "20.2 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 20.2 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0,
          "displayValue": "Est savings of 271 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 8,356 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 8,356 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 18 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 18 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 8,575 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 8,575 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoid enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": 0.5,
          "displayValue": "Total size was 11,461 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoid enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- Current value: Total size was 11,461 KiB\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/CMS.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/CMS.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:03 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706684.686922,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/Medicare.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/Medicare.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:10 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706690.120563,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/Openpaymentsdata.cms.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/Openpaymentsdata.cms.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:16 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706697.754500,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/Data.medicaid.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/Data.medicaid.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:23 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706703.442550,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/Data.healthcare.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/Data.healthcare.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:30 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706710.140726,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/SDIS.medicaid.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/SDIS.medicaid.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:36 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706717.504380,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/PFS.data.cms.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/PFS.data.cms.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:43 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706723.043726,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/Drupal-10/QIC.cms.gov",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/Drupal-10/QIC.cms.gov",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:38:49 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706729.497077,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/cms-web-experience-services",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/cms-web-experience-services/",
      "performanceScore": 0.89,
      "bestPracticesScore": 1,
      "transferBytes": 1592415,
      "co2Grams": 0.610024567581,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294415,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20880,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Improving the online experience for Medicare beneficiaries | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We are working to re-platform and redesign legacy systems for CMS, making it easier for millions of people to get the benefits they need.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/cms-web-experience-services/",
          "ogTitle": "Improving the online experience for Medicare beneficiaries | CivicActions",
          "ogDescription": "We are working to re-platform and redesign legacy systems for CMS, making it easier for millions of people to get the benefits they need.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/cms-web-experience-services/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 30,
          "tabletSmallTapTargets": 29,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 30,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 29,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 30 small targets on mobile and 29 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:38:59 GMT",
            "etag": "\"0734499b4480ce5f2c988aa296b06f9a7381eefe292f0af28529fe6c1bb485ef-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "14",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706739.238356,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 36,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 43,
          "imagesWithLazy": 10,
          "imagesWithoutLazy": 33
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "33 of 43 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 43,
            "lazyImages": 10,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 10/43 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 37,
        "urgency": "medium",
        "totalEstimatedSavingsBytes": 582155,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "high",
            "estimatedSavingsBytes": 582155,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "high",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 568.51 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 1591003,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 714258,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 698 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 582155,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 569 KiB",
            "urgency": "high",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277641,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 16949,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 697.52 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "high",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 568.51 KB."
          },
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.13 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 16.55 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 750435.8916666666
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 732.85 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 732.85 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 8,
        "urgency": "high",
        "transferBytes": 1592415,
        "css": {
          "unusedBytes": 16949,
          "ratio": 0.010643582232018663,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277641,
          "duplicatedBytes": 0,
          "ratio": 0.17435216322378275,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 16949,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277641,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 21,
        "urgency": "high",
        "transferBytes": 1592415,
        "estimatedDeferrableBytes": 1008848,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 714258,
          "unusedJavascriptSavings": 277641,
          "unusedCssSavings": 16949
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 714258,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277641,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 16949,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 680917,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_1_1c50d1865e/WECMS_1_1c50d1865e.png",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198305,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176059,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513600,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294415,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198305,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20880,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 10,
        "urgency": "medium",
        "transferBytes": 1592415,
        "estimatedRedundantBytes": 294590,
        "redundancyRatio": 0.1849957454558014,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277641,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 16949,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277641,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 16949,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 46,
        "urgency": "high",
        "totalTransferBytes": 1592415,
        "heavyRequestCount": 4,
        "heavyBytes": 1173637,
        "heavyRatio": 0.7370170464357595,
        "heavyRequests": [
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_1_1c50d1865e/WECMS_1_1c50d1865e.png",
            "transferSize": 680917,
            "resourceType": "image",
            "mimeType": "image/png",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198305,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "transferSize": 176059,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118356,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 680917
          },
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492720
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "storage.googleapis.com",
            "count": 1,
            "transferBytes": 680917
          },
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294415
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198305
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 714258,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277641,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "high",
            "estimatedSavingsBytes": 680917,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_1_1c50d1865e/WECMS_1_1c50d1865e.png",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198305,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176059,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.75,
          "displayValue": "3.1 s",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 3.1 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 569 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 569 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 698 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 698 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/cms-design-challenge-mvp",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
      "performanceScore": 0.81,
      "bestPracticesScore": 1,
      "transferBytes": 1244654,
      "co2Grams": 0.47680379683560004,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294419,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198304,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20881,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 3,
          "greenCount": 3,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Building an MVP for Medicare.gov with human-centered design | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "We did a fast-paced collaboration to submit deliverables in just 8 days, winning the design challenge to help CMS improve the customer experience of their websites.",
          "robots": "",
          "canonical": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
          "ogTitle": "Building an MVP for Medicare.gov with human-centered design | CivicActions",
          "ogDescription": "We did a fast-paced collaboration to submit deliverables in just 8 days, winning the design challenge to help CMS improve the customer experience of their websites.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/case-studies/cms-design-challenge-mvp/",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 36,
          "tabletSmallTapTargets": 36,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 5,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0,
            "gridContainersDetected": 1,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 36,
            "oversizedMedia": 0,
            "gridContainersDetected": 4,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 36 small targets on mobile and 36 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 55,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": false,
          "hasCsp": false,
          "hasXContentTypeOptions": false,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "date": "Mon, 20 Apr 2026 17:39:08 GMT",
            "etag": "\"78174ee7304cd2d776810d7d395e3c08a1015e8539b0ec1e3ed0b7ee00381949-br\"",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "5",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706749.899228,VS0,VE0"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Enable Strict-Transport-Security",
            "urgency": "medium",
            "detail": "Set a Strict-Transport-Security header to enforce HTTPS on repeat visits."
          },
          {
            "title": "Set X-Content-Type-Options: nosniff",
            "urgency": "medium",
            "detail": "Prevent MIME type sniffing by adding the nosniff response header."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 16,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 16
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "16 of 16 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 16,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/16 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 12,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 145862.30000000002,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [
          {
            "id": "modern-image-formats",
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "estimatedSavingsBytes": 145862.30000000002,
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size."
          }
        ],
        "recommendations": [
          {
            "title": "Use modern image compression formats",
            "urgency": "medium",
            "detail": "Prefer AVIF/WebP over legacy formats where possible to reduce transfer size. Estimated savings: 142.44 KB."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 100,
        "urgency": "high",
        "totalEstimatedSavingsBytes": 808956.3,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [
          {
            "id": "unused-javascript",
            "title": "Remove unused JavaScript",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code.",
            "estimatedSavingsBytes": 277644,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 271 KiB",
            "urgency": "high",
            "sourceAuditId": "unused-javascript"
          },
          {
            "id": "offscreen-images",
            "title": "Lazy-load offscreen images",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed.",
            "estimatedSavingsBytes": 270970,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 265 KiB",
            "urgency": "high",
            "sourceAuditId": "offscreen-images"
          },
          {
            "id": "modern-image-formats",
            "title": "Serve images in next-gen formats",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP.",
            "estimatedSavingsBytes": 145862.30000000002,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 142 KiB",
            "urgency": "medium",
            "sourceAuditId": "modern-image-formats"
          },
          {
            "id": "uses-responsive-images",
            "title": "Right-size images for viewport",
            "detail": "Avoid sending larger images than the rendered size needs.",
            "estimatedSavingsBytes": 96637,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 94 KiB",
            "urgency": "medium",
            "sourceAuditId": "uses-responsive-images"
          },
          {
            "id": "unused-css-rules",
            "title": "Remove unused CSS",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped.",
            "estimatedSavingsBytes": 17843,
            "estimatedBlockingMs": 0,
            "displayValue": "Est savings of 17 KiB",
            "urgency": "low",
            "sourceAuditId": "unused-css-rules"
          }
        ],
        "recommendations": [
          {
            "title": "Remove unused JavaScript",
            "urgency": "high",
            "detail": "Reduce dead JS and split bundles to avoid shipping non-critical code. Estimated byte savings: 271.14 KB."
          },
          {
            "title": "Lazy-load offscreen images",
            "urgency": "high",
            "detail": "Defer below-the-fold imagery until it is likely to be viewed. Estimated byte savings: 264.62 KB."
          },
          {
            "title": "Serve images in next-gen formats",
            "urgency": "medium",
            "detail": "Convert high-byte images to more efficient formats such as AVIF or WebP. Estimated byte savings: 142.44 KB."
          },
          {
            "title": "Right-size images for viewport",
            "urgency": "medium",
            "detail": "Avoid sending larger images than the rendered size needs. Estimated byte savings: 94.37 KB."
          },
          {
            "title": "Remove unused CSS",
            "urgency": "low",
            "detail": "Trim unused selectors and split CSS so only needed styles are shipped. Estimated byte savings: 17.42 KB."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0.5,
          "cacheSavingsBytes": 493378.88333333336
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 481.82 KB)."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "medium",
            "detail": "Improve long-lived cache headers for immutable static assets (estimated savings opportunity: 481.82 KB)."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 11,
        "urgency": "high",
        "transferBytes": 1244654,
        "css": {
          "unusedBytes": 17843,
          "ratio": 0.014335710968670812,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 277644,
          "duplicatedBytes": 0,
          "ratio": 0.22306922245057662,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [
          {
            "area": "css",
            "title": "Remove unused CSS selectors and component styles",
            "urgency": "medium",
            "estimatedSavingsBytes": 17843,
            "strategy": "Trim styles that never match rendered markup and split component CSS so only used styles are shipped.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          },
          {
            "area": "javascript",
            "title": "Remove unused JavaScript and feature bundles",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "strategy": "Drop unused packages and feature code, or move them behind route-level or interaction-triggered imports.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "4",
              "title": "Remove unnecessary code",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
              "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 15,
        "urgency": "high",
        "transferBytes": 1244654,
        "estimatedDeferrableBytes": 566457,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 270970,
          "unusedJavascriptSavings": 277644,
          "unusedCssSavings": 17843
        },
        "candidates": [
          {
            "title": "Lazy-load offscreen images",
            "area": "image",
            "urgency": "high",
            "estimatedSavingsBytes": 270970,
            "strategy": "Load below-the-fold images only when they approach the viewport.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Defer non-critical JavaScript",
            "area": "javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "strategy": "Split bundles and load feature code on interaction or route transition.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Inline critical CSS and defer remainder",
            "area": "stylesheet",
            "urgency": "medium",
            "estimatedSavingsBytes": 17843,
            "strategy": "Ship only above-the-fold CSS in initial render path and defer non-critical styles.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from js.hsforms.net",
            "area": "script",
            "urgency": "high",
            "estimatedSavingsBytes": 198304,
            "url": "https://js.hsforms.net/forms/v2.js",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy script from www.googletagmanager.com",
            "area": "script",
            "urgency": "medium",
            "estimatedSavingsBytes": 176052,
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          },
          {
            "title": "Evaluate deferred loading for heavy image from storage.googleapis.com",
            "area": "image",
            "urgency": "medium",
            "estimatedSavingsBytes": 121975,
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg",
            "strategy": "Confirm this asset is required for first paint; defer or lazy-load if not critical.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "8",
              "title": "Defer the loading of non-critical resources",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
              "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 53,
        "urgency": "medium",
        "providerCount": 3,
        "requestCount": 4,
        "transferBytes": 513604,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [
          {
            "hostname": "www.googletagmanager.com",
            "resourceType": "script",
            "requestCount": 2,
            "transferBytes": 294419,
            "sampleUrl": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "greenCheck": {
              "hostname": "www.googletagmanager.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2026-03-06T00:36:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.googletagmanager.com",
              "error": null
            }
          },
          {
            "hostname": "js.hsforms.net",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 198304,
            "sampleUrl": "https://js.hsforms.net/forms/v2.js",
            "greenCheck": {
              "hostname": "js.hsforms.net",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Cloudflare",
              "hostedByWebsite": "https://www.cloudflare.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-24T19:45:07",
              "supportingDocuments": [
                {
                  "id": 18,
                  "title": "Blog post - The Climate and Cloudflare",
                  "link": "https://blog.cloudflare.com/the-climate-and-cloudflare/"
                },
                {
                  "id": 1264,
                  "title": "Cloudflare 2023 Emissions Inventory",
                  "link": "https://media.greenweb.org/uploads/Cloudflare_2023_Emissions_Inventory.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/js.hsforms.net",
              "error": null
            }
          },
          {
            "hostname": "www.google-analytics.com",
            "resourceType": "script",
            "requestCount": 1,
            "transferBytes": 20881,
            "sampleUrl": "https://www.google-analytics.com/analytics.js",
            "greenCheck": {
              "hostname": "www.google-analytics.com",
              "checked": true,
              "status": "green",
              "green": true,
              "hostedBy": "Google Cloud",
              "hostedByWebsite": "https://cloud.google.com",
              "listedProvider": true,
              "partner": null,
              "modified": "2025-11-25T09:52:18",
              "supportingDocuments": [
                {
                  "id": 108,
                  "title": "Sustainability at Google",
                  "link": "https://sustainability.google"
                },
                {
                  "id": 1364,
                  "title": "Google 2024 Environmental Report",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-environmental-report.pdf"
                },
                {
                  "id": 1365,
                  "title": "Alphabet 2024 CDP Climate Change Response",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-2024-cdp-climate-change-response.pdf"
                },
                {
                  "id": 1366,
                  "title": "Google 2024 Supplier Responsibility Report.",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/google-2024-supplier-responsibility-report.pdf"
                },
                {
                  "id": 1367,
                  "title": "Alphabet FY2023 Environmental Indicators Assurance Letter",
                  "link": "https://www.gstatic.com/gumdrop/sustainability/alphabet-fy2023-environmental-indicators-assurance-letter.pdf"
                },
                {
                  "id": 1368,
                  "title": "3Degrees Cloud Services Review Statement",
                  "link": "https://services.google.com/fh/files/misc/3degrees_cloud_services_review_statement_final.pdf"
                }
              ],
              "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/www.google-analytics.com",
              "error": null
            }
          }
        ],
        "recommendations": [
          {
            "title": "Maintain a third-party JavaScript inventory",
            "urgency": "medium",
            "detail": "Track 3 third-party script origin(s) and assign an owner plus business justification for each."
          },
          {
            "title": "Reduce third-party script payload and requests",
            "urgency": "high",
            "detail": "Defer non-critical tags, remove unused vendors, and gate scripts behind consent or user interaction."
          }
        ]
      },
      "redundancy": {
        "score": 13,
        "urgency": "medium",
        "transferBytes": 1244654,
        "estimatedRedundantBytes": 295487,
        "redundancyRatio": 0.23740493341924743,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [
          {
            "auditId": "unused-javascript",
            "title": "Reduce unused JavaScript",
            "savingsBytes": 277644,
            "displayValue": "Est savings of 271 KiB"
          },
          {
            "auditId": "unused-css-rules",
            "title": "Reduce unused CSS",
            "savingsBytes": 17843,
            "displayValue": "Est savings of 17 KiB"
          }
        ],
        "recommendations": [
          {
            "title": "Reduce unused javascript",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "auditId": "unused-javascript",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          },
          {
            "title": "Reduce unused css",
            "urgency": "medium",
            "estimatedSavingsBytes": 17843,
            "auditId": "unused-css-rules",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "2",
              "title": "Remove unnecessary or redundant information",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
              "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 33,
        "urgency": "medium",
        "totalTransferBytes": 1244654,
        "heavyRequestCount": 4,
        "heavyBytes": 614698,
        "heavyRatio": 0.4938705857210116,
        "heavyRequests": [
          {
            "url": "https://js.hsforms.net/forms/v2.js",
            "transferSize": 198304,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "js.hsforms.net"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "transferSize": 176052,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          },
          {
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg",
            "transferSize": 121975,
            "resourceType": "image",
            "mimeType": "image/jpeg",
            "domain": "storage.googleapis.com"
          },
          {
            "url": "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1",
            "transferSize": 118367,
            "resourceType": "script",
            "mimeType": "application/javascript",
            "domain": "www.googletagmanager.com"
          }
        ],
        "groupedByType": [
          {
            "resourceType": "script",
            "count": 3,
            "transferBytes": 492723
          },
          {
            "resourceType": "image",
            "count": 1,
            "transferBytes": 121975
          }
        ],
        "groupedByOrigin": [
          {
            "domain": "www.googletagmanager.com",
            "count": 2,
            "transferBytes": 294419
          },
          {
            "domain": "js.hsforms.net",
            "count": 1,
            "transferBytes": 198304
          },
          {
            "domain": "storage.googleapis.com",
            "count": 1,
            "transferBytes": 121975
          }
        ],
        "onDemandCandidates": [
          {
            "title": "Lazy-load offscreen images and media galleries",
            "urgency": "high",
            "estimatedSavingsBytes": 270970,
            "strategy": "Load imagery only when it enters the viewport or when a user opens the relevant section.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Split JavaScript by route or interaction",
            "urgency": "high",
            "estimatedSavingsBytes": 277644,
            "strategy": "Move non-critical bundles behind route-level or event-driven imports so they are only fetched on demand.",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from js.hsforms.net",
            "urgency": "medium",
            "estimatedSavingsBytes": 198304,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://js.hsforms.net/forms/v2.js",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy script asset from www.googletagmanager.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 176052,
            "strategy": "Load this script only on pages or interactions that require it; prefer dynamic import and feature-level bundles.",
            "url": "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0h1",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          },
          {
            "title": "Modularize heavy image asset from storage.googleapis.com",
            "urgency": "medium",
            "estimatedSavingsBytes": 121975,
            "strategy": "Serve a smaller placeholder first and load this asset only when the user scrolls to or requests the component.",
            "url": "https://storage.googleapis.com/ca-it-prod-home-5918-strapi/production/WECMS_Design_hero_1b260dd84e/WECMS_Design_hero_1b260dd84e.jpg",
            "wsg": {
              "categoryId": "3",
              "categoryName": "Web Development",
              "id": "3",
              "title": "Modularize bandwidth-heavy components",
              "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
              "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
            }
          }
        ],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": 0.4,
          "displayValue": "4.4 s",
          "impact": "high",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- Current value: 4.4 s\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": 0,
          "displayValue": "Est savings of 142 KiB",
          "impact": "high",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- Current value: Est savings of 142 KiB\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": 0.5,
          "displayValue": "Est savings of 271 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- Current value: Est savings of 271 KiB\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": 0.5,
          "displayValue": "Est savings of 17 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- Current value: Est savings of 17 KiB\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": 0.5,
          "displayValue": "Est savings of 265 KiB",
          "impact": "medium",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- Current value: Est savings of 265 KiB\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    },
    {
      "url": "https://civicactions.com/case-studies/fearless.tech",
      "status": "ok",
      "finalUrl": "https://civicactions.com/case-studies/fearless.tech",
      "performanceScore": null,
      "bestPracticesScore": null,
      "transferBytes": 0,
      "co2Grams": 0,
      "greenWeb": {
        "page": {
          "hostname": "civicactions.com",
          "checked": true,
          "status": "not-green",
          "green": false,
          "hostedBy": null,
          "hostedByWebsite": null,
          "listedProvider": null,
          "partner": null,
          "modified": "2026-04-20T17:29:20.904677",
          "supportingDocuments": [],
          "source": "https://api.thegreenwebfoundation.org/api/v3/greencheck/civicactions.com",
          "error": null
        },
        "externalAssets": [],
        "summary": {
          "pageStatus": "not-green",
          "externalOriginCount": 0,
          "greenCount": 0,
          "notGreenCount": 1,
          "unknownCount": 0
        }
      },
      "formValidation": {
        "score": 0,
        "urgency": "low",
        "pageElementOccurrences": 0,
        "uniqueElementsAssessed": 0,
        "reusedFromCacheCount": 0,
        "components": [],
        "recommendations": [
          {
            "title": "No major form validation risks detected",
            "urgency": "low",
            "detail": "Continue testing form flows to ensure error handling remains clear across templates."
          }
        ]
      },
      "metadata": {
        "score": 0,
        "urgency": "low",
        "checks": {
          "hasTitle": true,
          "hasLang": true,
          "hasDescription": true,
          "hasCanonical": true,
          "hasOpenGraphCore": true,
          "hasTwitterCard": true,
          "hasViewport": true,
          "hasCharset": true,
          "hasValidStructuredData": true,
          "hasInvalidStructuredData": false
        },
        "observed": {
          "title": "Page not found | CivicActions",
          "lang": "en",
          "charset": "utf-8",
          "viewport": "width=device-width, initial-scale=1, shrink-to-fit=no",
          "description": "Sorry it seems the page you were looking for was not found.",
          "robots": "",
          "canonical": "https://civicactions.com/404.html",
          "ogTitle": "Page not found | CivicActions",
          "ogDescription": "Sorry it seems the page you were looking for was not found.",
          "ogType": "website",
          "ogUrl": "https://civicactions.com/404.html",
          "twitterCard": "summary_large_image",
          "ldJsonCount": 0,
          "validLdJsonCount": 0,
          "invalidLdJsonCount": 0
        },
        "recommendations": [
          {
            "title": "Metadata structure looks healthy",
            "urgency": "low",
            "detail": "Core machine-readable metadata is present and no structural issues were detected."
          }
        ]
      },
      "layoutAdaptation": {
        "score": 30,
        "urgency": "medium",
        "checks": {
          "testedMobile": true,
          "testedTablet": true,
          "horizontalOverflowOnMobile": false,
          "horizontalOverflowOnTablet": false,
          "mobileSmallTapTargets": 32,
          "tabletSmallTapTargets": 31,
          "fixedWidthOffenders": 0,
          "oversizedMedia": 0,
          "gridContainersDetected": 3,
          "mobileGridOverflowContainers": 0,
          "tabletGridOverflowContainers": 0,
          "gridOverflowContainers": 0,
          "scanErrors": 0
        },
        "perDevice": [
          {
            "device": "mobile",
            "viewportWidth": 390,
            "viewportHeight": 844,
            "contentWidth": 390,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 32,
            "oversizedMedia": 0,
            "gridContainersDetected": 0,
            "gridOverflowContainers": 0
          },
          {
            "device": "tablet",
            "viewportWidth": 820,
            "viewportHeight": 1180,
            "contentWidth": 820,
            "horizontalOverflowPx": 0,
            "hasHorizontalOverflow": false,
            "fixedWidthOffenders": 0,
            "smallTapTargets": 31,
            "oversizedMedia": 0,
            "gridContainersDetected": 3,
            "gridOverflowContainers": 0
          }
        ],
        "recommendations": [
          {
            "title": "Increase touch target sizes",
            "urgency": "high",
            "detail": "Ensure interactive controls are at least 44x44 CSS px. Detected 32 small targets on mobile and 31 on tablet."
          }
        ]
      },
      "securityLight": {
        "score": 32,
        "urgency": "medium",
        "checks": {
          "isHttps": true,
          "hasHsts": true,
          "hasCsp": false,
          "hasXContentTypeOptions": true,
          "hasReferrerPolicy": false,
          "hasPermissionsPolicy": false,
          "exposesServerFingerprint": false,
          "externalScriptCount": 1,
          "externalScriptsWithoutIntegrity": 1,
          "vulnerableLibraryCount": 0
        },
        "observed": {
          "headers": {
            "accept-ranges": "bytes",
            "alt-svc": "h3=\":443\";ma=86400,h3-29=\":443\";ma=86400,h3-27=\":443\";ma=86400",
            "cache-control": "public, max-age=0, must-revalidate",
            "content-encoding": "gzip",
            "content-length": "27773",
            "content-type": "text/html; charset=utf-8",
            "date": "Mon, 20 Apr 2026 17:39:15 GMT",
            "etag": "\"f44c992435026f552d32ba6a957b35abe738e49f39a6a4cf5cf54c211ab98e1a\"",
            "last-modified": "Mon, 20 Apr 2026 17:26:42 GMT",
            "strict-transport-security": "max-age=31556926",
            "vary": "x-fh-requested-host, accept-encoding",
            "x-cache": "HIT",
            "x-cache-hits": "6",
            "x-content-type-options": "nosniff",
            "x-frame-options": "DENY",
            "x-served-by": "cache-iad-kcgs7200034-IAD",
            "x-timer": "S1776706755.478522,VS0,VE0",
            "x-xss-protection": "1; mode=block"
          },
          "vulnerableLibrariesAuditScore": null,
          "vulnerableLibraries": []
        },
        "recommendations": [
          {
            "title": "Add a Content-Security-Policy header",
            "urgency": "high",
            "detail": "Add an appropriate CSP to reduce script injection and resource loading risk."
          },
          {
            "title": "Define a Referrer-Policy",
            "urgency": "low",
            "detail": "Set a referrer policy to reduce unnecessary URL data leakage."
          },
          {
            "title": "Define a Permissions-Policy",
            "urgency": "low",
            "detail": "Restrict browser capabilities to only what the application needs."
          },
          {
            "title": "Add SRI to external scripts",
            "urgency": "medium",
            "detail": "1 external script tag(s) are missing integrity attributes."
          }
        ]
      },
      "expectedFiles": {
        "score": 40,
        "urgency": "medium",
        "origin": "https://civicactions.com",
        "checks": [
          {
            "path": "/robots.txt",
            "kind": "expected",
            "url": "https://civicactions.com/robots.txt",
            "found": true,
            "status": 200,
            "contentType": "text/plain; charset=utf-8"
          },
          {
            "path": "/sitemap.xml",
            "kind": "beneficial",
            "url": "https://civicactions.com/sitemap.xml",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/.well-known/security.txt",
            "kind": "beneficial",
            "url": "https://civicactions.com/.well-known/security.txt",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          },
          {
            "path": "/manifest.webmanifest",
            "kind": "beneficial",
            "url": "https://civicactions.com/manifest.webmanifest",
            "found": true,
            "status": 200,
            "contentType": "application/manifest+json"
          },
          {
            "path": "/favicon.ico",
            "kind": "beneficial",
            "url": "https://civicactions.com/favicon.ico",
            "found": false,
            "status": 404,
            "contentType": "text/html; charset=utf-8"
          }
        ],
        "recommendations": [
          {
            "title": "Add beneficial discoverability and maintenance files",
            "urgency": "medium",
            "detail": "Missing beneficial file(s): /sitemap.xml, /.well-known/security.txt, /favicon.ico."
          }
        ]
      },
      "mediaHints": {
        "score": 50,
        "urgency": "medium",
        "checks": {
          "hasDarkMode": false,
          "hasMetaColorScheme": false,
          "hasDarkModeQuery": false,
          "autoplayingMedia": [],
          "autoplayCount": 0,
          "unmutedAutoplayCount": 0,
          "totalImages": 13,
          "imagesWithLazy": 0,
          "imagesWithoutLazy": 13
        },
        "recommendations": [
          {
            "title": "Add dark mode support",
            "urgency": "medium",
            "detail": "No prefers-color-scheme: dark media query or color-scheme meta tag was found. Dark mode reduces energy use on OLED screens and improves user choice."
          },
          {
            "title": "Add loading=\"lazy\" to images",
            "urgency": "high",
            "detail": "13 of 13 image(s) lack an explicit loading=\"lazy\" attribute. Lazy loading defers below-fold images and reduces initial page weight."
          }
        ]
      },
      "wsgCustom": {
        "score": 45,
        "urgency": "high",
        "data": {
          "hasPrintStyles": false,
          "hasReducedMotion": false,
          "media": {
            "totalImages": 13,
            "lazyImages": 0,
            "totalIframes": 0,
            "lazyIframes": 0
          },
          "typography": {
            "primaryFont": "Nunito",
            "usesSystemFont": false
          },
          "tracking": {
            "count": 3,
            "scripts": [
              "https://www.googletagmanager.com/gtag/js?id=G-Y5EFTNKK2G&cx=c&gtm=4e64g0",
              "https://www.google-analytics.com/analytics.js",
              "https://www.googletagmanager.com/gtag/js?id=UA-1170467-1"
            ]
          },
          "semantics": {
            "hasNavigation": true,
            "hasMainContent": true
          }
        },
        "recommendations": [
          {
            "guideline": "17.1",
            "title": "Missing print style sheet",
            "urgency": "low",
            "detail": "Add a @media print stylesheet to ensure the page is optimized for paper-saving printing.",
            "wsid": "17.printed documents",
            "assessor": "script",
            "example": "@media print {\n  /* Hide non-critical navigation and backgrounds */\n  nav, .ads, header, footer { display: none; }\n  body { font-size: 12pt; color: #000; background: #fff; }\n  a::after { content: \" (\" attr(href) \") \"; } /* Show URLs */\n}"
          },
          {
            "guideline": "12.3",
            "title": "No reduced motion support",
            "urgency": "low",
            "detail": "Implement prefers-reduced-motion to allow users to disable animations, reducing compute and improving accessibility.",
            "wsid": "12.control animation",
            "assessor": "script",
            "example": "@media (prefers-reduced-motion: reduce) {\n  *, ::before, ::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}"
          },
          {
            "guideline": "11.3",
            "title": "Incomplete media lazy loading",
            "urgency": "medium",
            "detail": "Only 0/13 images use loading=\"lazy\". Global lazy loading reduces initial data transfer and energy consumption.",
            "wsid": "11.lazy loading",
            "assessor": "script",
            "example": "<img src=\"image.webp\" alt=\"Description\" loading=\"lazy\" width=\"800\" height=\"600\">\n<!-- Works for iframes too -->\n<iframe src=\"video.html\" loading=\"lazy\"></iframe>"
          },
          {
            "guideline": "13.1",
            "title": "Missing system font fallback",
            "urgency": "medium",
            "detail": "Primary font \"Nunito\" does not appear to use a system font stack fallback. System fonts reduce network requests and improve rendering performance.",
            "wsid": "13.pre-installed typefaces",
            "assessor": "script",
            "example": "body {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n}"
          },
          {
            "guideline": "7.3",
            "title": "Multiple tracking scripts detected",
            "urgency": "medium",
            "detail": "Found 3 commercial tracking scripts. Consider lightweight, privacy-focused alternatives like Plausible or Fathom to reduce JS weight and energy footprint.",
            "wsid": "7.analytics and tracking",
            "assessor": "script",
            "example": "<!-- Replace heavy trackers with lightweight alternatives -->\n<script defer data-domain=\"yourdomain.com\" src=\"https://plausible.io/js/script.js\"></script>"
          },
          {
            "guideline": "2.4",
            "title": "Review User Journey Efficiency",
            "urgency": "investigate",
            "detail": "Have a human walk through the main user journeys and verify they require the fewest steps possible. Unnecessary steps waste user time and device energy. Look for redundant confirmations, forced account creation, and non-essential interstitials.",
            "wsid": "2.minimize non-essential content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#minimize-non-essential-content-interactivity-or-journeys",
            "assessor": "human"
          },
          {
            "guideline": "2.6",
            "title": "Check for Engagement Traps",
            "urgency": "investigate",
            "detail": "Manually review the page for patterns that artificially prolong engagement: infinite scroll, autoplay carousels, sticky overlays, and notification permission prompts. These waste user attention and device energy.",
            "wsid": "2.design to assist not distract",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#design-to-assist-and-not-to-distract",
            "assessor": "human"
          },
          {
            "guideline": "2.7",
            "title": "Audit for Deceptive Design Patterns",
            "urgency": "investigate",
            "detail": "Have a human identify dark patterns: misleading consent dialogs, hidden unsubscribe links, forced continuity, and bait-and-switch flows. Deceptive patterns waste user time and undermine trust.",
            "wsid": "2.avoid manipulative deceptive",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#avoid-being-manipulative-or-deceptive",
            "assessor": "human"
          },
          {
            "guideline": "2.14",
            "title": "Verify Accessible Alternatives for All Media",
            "urgency": "investigate",
            "detail": "Manually check that every video has captions, every audio file has a transcript, every image has meaningful alt text, and every PDF has an accessible HTML alternative. Alternatives let assistive technology users avoid re-downloading heavy formats.",
            "wsid": "2.offer suitable alternatives",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#offer-suitable-alternatives-for-every-format-used",
            "assessor": "human"
          },
          {
            "guideline": "2.18",
            "title": "Confirm User Research Was Conducted",
            "urgency": "investigate",
            "detail": "Verify that genuine user research or usability testing has informed the design. Research-driven design reduces wasted iterations, removes unnecessary features, and ensures the product meets real needs efficiently.",
            "wsid": "2.involve users early",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#involve-users-early-in-the-project",
            "assessor": "human"
          },
          {
            "guideline": "2.10",
            "title": "Review Content Conciseness",
            "urgency": "investigate",
            "detail": "Use a Large Language Model (e.g. locally or via API) to evaluate page text for conciseness and clarity. Removing superfluous text reduces payload, reading time, and inference energy for search engines indexing this content.",
            "wsid": "2.provide clear inclusive content",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#provide-clear-inclusive-content-with-purpose",
            "assessor": "ai"
          },
          {
            "guideline": "4.4",
            "title": "Verify Error Pages and Redirects Are Configured",
            "urgency": "investigate",
            "detail": "Have a human check that custom 404 and 500 error pages exist and that there are no redirect chains longer than one hop. Broken links force wasted round-trips. Redirect chains multiply transfer costs.",
            "wsid": "4.error pages redirection",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#setup-necessary-error-pages-and-redirection-links",
            "assessor": "human"
          },
          {
            "guideline": "4.10",
            "title": "Review CDN Usage and Geographic Distribution",
            "urgency": "investigate",
            "detail": "Confirm that static assets are served from a CDN and that the CDN edge nodes are geographically close to the primary audience. CDN misuse—or absence—increases last-mile transfer distance and the associated energy cost of data delivery.",
            "wsid": "4.content delivery networks",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#use-content-delivery-networks-cdns-appropriately",
            "assessor": "human"
          },
          {
            "guideline": "5.2",
            "title": "Confirm a Sustainability Advocate Is Assigned",
            "urgency": "investigate",
            "detail": "Verify that someone on the team has explicit responsibility for web sustainability. Without a designated advocate, sustainability improvements tend to be deprioritized and never reach the backlog.",
            "wsid": "5.assign sustainability advocate",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#assign-a-sustainability-advocate",
            "assessor": "human"
          },
          {
            "guideline": "5.8",
            "title": "Check for a Public Sustainability Statement",
            "urgency": "investigate",
            "detail": "Look for a publicly accessible sustainability statement, disclosure page, or environmental policy. Mandatory disclosure requirements are growing globally and transparency builds user trust. The statement should include measurable targets and dates.",
            "wsid": "5.support mandatory disclosures",
            "wsgUrl": "https://www.w3.org/TR/web-sustainability-guidelines/#support-mandatory-disclosures-and-reporting",
            "assessor": "human"
          }
        ]
      },
      "gridAware": {
        "detected": false,
        "signals": {
          "hasGridAwareAttr": false,
          "gridAwareValue": null,
          "hasInfoBar": false,
          "scriptSignals": [],
          "headerSignals": [],
          "electricityMapsRequests": 0
        },
        "recommendations": [
          {
            "title": "Consider implementing grid-aware website adaptation",
            "urgency": "investigate",
            "detail": "Grid-aware websites serve lighter experiences when the local grid runs on carbon-intensive energy. The Green Web Foundation provides a JS library and edge-function plugins (Cloudflare Workers, Netlify Edge) to implement this with minimal code.",
            "wsgUrl": "https://www.thegreenwebfoundation.org/tools/grid-aware-websites/",
            "assessor": "human"
          }
        ]
      },
      "compressionOpportunities": {
        "wsgReference": {
          "title": "Reduce data transfer with compression",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#reduce-data-transfer-with-compression"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "checks": {
          "hasEffectiveTextCompression": true
        },
        "opportunities": [],
        "recommendations": [
          {
            "title": "No major compression opportunity detected",
            "urgency": "low",
            "detail": "Compression signals look healthy in current Lighthouse audits; continue enforcing compression and asset encoding in CI/CD."
          }
        ]
      },
      "optimizationOpportunities": {
        "wsgReference": {
          "title": "Use the most efficient solution for your service",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service"
        },
        "score": 0,
        "urgency": "low",
        "totalEstimatedSavingsBytes": 0,
        "totalEstimatedBlockingMs": 0,
        "opportunities": [],
        "recommendations": [
          {
            "title": "No obvious optimization bloat signals",
            "urgency": "low",
            "detail": "No major easy-win optimization opportunities were detected from current Lighthouse signals."
          }
        ]
      },
      "dependencyMaintenance": {
        "wsgReference": {
          "title": "Use dependencies appropriately and ensure maintenance",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance"
        },
        "score": 2,
        "urgency": "medium",
        "vulnerableLibraryCount": 0,
        "vulnerableLibraries": [],
        "externalScriptsWithoutIntegrity": 1,
        "recommendations": [
          {
            "title": "Add integrity attributes for external dependencies",
            "urgency": "medium",
            "detail": "1 external script dependency URL(s) are missing SRI integrity attributes."
          }
        ]
      },
      "offlineSupport": {
        "wsgReference": {
          "title": "Optimize caching and support offline access",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-caching-and-support-offline-access"
        },
        "score": 100,
        "urgency": "high",
        "checks": {
          "hasServiceWorker": false,
          "worksOffline": false,
          "hasInstallableManifest": false,
          "hasOfflineStartUrl": false,
          "longCacheTtlScore": 0,
          "cacheSavingsBytes": 0
        },
        "opportunities": [
          {
            "id": "service-worker",
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "id": "works-offline",
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "id": "installable-manifest",
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "id": "offline-start-url",
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "id": "uses-long-cache-ttl",
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ],
        "recommendations": [
          {
            "title": "Add service worker support",
            "urgency": "high",
            "detail": "Register a service worker to support resilient caching and offline behavior for key routes."
          },
          {
            "title": "Ensure critical routes work offline",
            "urgency": "high",
            "detail": "Provide an offline fallback strategy for key pages and shell assets."
          },
          {
            "title": "Improve web app manifest support",
            "urgency": "medium",
            "detail": "Complete manifest fields so clients can install and run an app-like experience."
          },
          {
            "title": "Support offline start URL behavior",
            "urgency": "medium",
            "detail": "Ensure start URL and shell routing can load in disconnected conditions."
          },
          {
            "title": "Strengthen static asset cache TTL",
            "urgency": "high",
            "detail": "Improve long-lived cache headers for immutable static assets."
          }
        ]
      },
      "languageVersionGuidance": {
        "wsgReference": {
          "title": "Use the latest stable language version",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-latest-stable-language-version"
        },
        "score": 0,
        "urgency": "low",
        "observedTechnologies": [],
        "outdatedTechnologies": [],
        "vulnerableLibraryCount": 0,
        "recommendations": [
          {
            "title": "No obvious outdated runtime version disclosed",
            "urgency": "low",
            "detail": "No clearly outdated runtime version signals were exposed in sampled HTTP headers. Verify language/runtime versions in source and CI since backend versions are not always externally visible."
          }
        ]
      },
      "deadCode": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "css": {
          "unusedBytes": 0,
          "ratio": 0,
          "auditId": "unused-css-rules"
        },
        "javascript": {
          "unusedBytes": 0,
          "duplicatedBytes": 0,
          "ratio": 0,
          "auditIds": [
            "unused-javascript",
            "duplicated-javascript"
          ]
        },
        "html": {
          "estimatedPenalty": 0,
          "totalBodyElements": 0,
          "maxDepth": 0,
          "maxChildElements": 0,
          "note": "HTML dead code cannot be measured directly from Lighthouse. This score estimates unnecessary markup from DOM size and complexity signals."
        },
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "4",
          "title": "Remove unnecessary code",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-code",
          "subheading": "Clear out dead or unused code as it builds up in a project to reduce the amount of wasted data being transferred."
        }
      },
      "nonCriticalResources": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedDeferrableBytes": 0,
        "renderBlockingMs": 0,
        "breakdown": {
          "offscreenImageSavings": 0,
          "unusedJavascriptSavings": 0,
          "unusedCssSavings": 0
        },
        "candidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "8",
          "title": "Defer the loading of non-critical resources",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#defer-the-loading-of-non-critical-resources",
          "subheading": "Avoid render-blocking slowdowns by asynchronously loading, deferring, or prioritizing external resources as appropriate."
        }
      },
      "thirdPartyJs": {
        "wsgReference": {
          "title": "Give third parties the same priority as first parties during assessment",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#give-third-parties-the-same-priority-as-first-parties-during-assessment"
        },
        "score": 0,
        "urgency": "low",
        "providerCount": 0,
        "requestCount": 0,
        "transferBytes": 0,
        "notGreenCount": 0,
        "unknownCount": 0,
        "scripts": [],
        "recommendations": [
          {
            "title": "No major third-party JavaScript risk signals",
            "urgency": "low",
            "detail": "Continue periodic reviews so third-party additions are assessed with the same rigor as first-party code."
          }
        ]
      },
      "redundancy": {
        "score": 0,
        "urgency": "low",
        "transferBytes": 0,
        "estimatedRedundantBytes": 0,
        "redundancyRatio": 0,
        "relatedAuditIds": [
          "unused-css-rules",
          "unused-javascript",
          "duplicated-javascript",
          "dom-size",
          "uses-text-compression",
          "unminified-css",
          "unminified-javascript"
        ],
        "wasteByAudit": [],
        "recommendations": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "2",
          "title": "Remove unnecessary or redundant information",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
          "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
        }
      },
      "modularization": {
        "score": 0,
        "urgency": "low",
        "totalTransferBytes": 0,
        "heavyRequestCount": 0,
        "heavyBytes": 0,
        "heavyRatio": 0,
        "heavyRequests": [],
        "groupedByType": [],
        "groupedByOrigin": [],
        "onDemandCandidates": [],
        "wsg": {
          "categoryId": "3",
          "categoryName": "Web Development",
          "id": "3",
          "title": "Modularize bandwidth-heavy components",
          "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
          "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
        }
      },
      "findings": [
        {
          "auditId": "largest-contentful-paint",
          "title": "Largest Contentful Paint",
          "description": "Largest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Largest Contentful Paint\n\n- Lighthouse audit: largest-contentful-paint\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nLargest Contentful Paint marks the time at which the largest text or image is painted. [Learn more about the Largest Contentful Paint metric](https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/)\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "speed-index",
          "title": "Speed Index",
          "description": "Speed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "1",
            "title": "Set goals based on performance and energy impact",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact",
            "subheading": "Account for the difference in energy intensity that different types of content may have on a project and set goals based on what you would like to achieve."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Speed Index\n\n- Lighthouse audit: speed-index\n- WSG guideline: 1 Set goals based on performance and energy impact\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#set-goals-based-on-performance-and-energy-impact\n\n### Why this matters\nSpeed Index shows how quickly the contents of a page are visibly populated. [Learn more about the Speed Index metric](https://developer.chrome.com/docs/lighthouse/performance/speed-index/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-javascript",
          "title": "Reduce unused JavaScript",
          "description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "16",
            "title": "Use dependencies appropriately and ensure maintenance",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance",
            "subheading": "Use libraries and frameworks only where necessary, when plain code or smaller packages are inappropriate for the use case, and they are kept up to date."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused JavaScript\n\n- Lighthouse audit: unused-javascript\n- WSG guideline: 16 Use dependencies appropriately and ensure maintenance\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-dependencies-appropriately-and-ensure-maintenance\n\n### Why this matters\nReduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "unused-css-rules",
          "title": "Reduce unused CSS",
          "description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Reduce unused CSS\n\n- Lighthouse audit: unused-css-rules\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nReduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "modern-image-formats",
          "title": "Serve images in next-gen formats",
          "description": "Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Serve images in next-gen formats\n\n- Lighthouse audit: modern-image-formats\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nImage formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more about modern image formats](https://developer.chrome.com/docs/lighthouse/performance/uses-webp-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-optimized-images",
          "title": "Efficiently encode images",
          "description": "Optimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "2",
            "categoryName": "User Experience Design",
            "id": "11",
            "title": "Optimize media to reduce resource use",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use",
            "subheading": "Ensure all media - including audio, video, animation, images, and other novel formats, when deemed necessary in the design, are optimized, correctly sized and formatted, use lazy loading where appropriate, with a usage policy in place."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Efficiently encode images\n\n- Lighthouse audit: uses-optimized-images\n- WSG guideline: 11 Optimize media to reduce resource use\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#optimize-media-to-reduce-resource-use\n\n### Why this matters\nOptimized images load faster and consume less cellular data. [Learn how to efficiently encode images](https://developer.chrome.com/docs/lighthouse/performance/uses-optimized-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "offscreen-images",
          "title": "Defer offscreen images",
          "description": "Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "3",
            "title": "Modularize bandwidth-heavy components",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components",
            "subheading": "Break down large components into smaller, self-contained pieces that can be requested only when required to save bandwidth."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Defer offscreen images\n\n- Lighthouse audit: offscreen-images\n- WSG guideline: 3 Modularize bandwidth-heavy components\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#modularize-bandwidth-heavy-components\n\n### Why this matters\nConsider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn how to defer offscreen images](https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "render-blocking-resources",
          "title": "Eliminate render-blocking resources",
          "description": "Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Eliminate render-blocking resources\n\n- Lighthouse audit: render-blocking-resources\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nResources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn how to eliminate render-blocking resources](https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-text-compression",
          "title": "Enable text compression",
          "description": "Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Enable text compression\n\n- Lighthouse audit: uses-text-compression\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nText-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more about text compression](https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "uses-rel-preconnect",
          "title": "Preconnect to required origins",
          "description": "Consider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "18",
            "title": "Use the most efficient solution for your service",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service",
            "subheading": "Identify the project requirements, use the most efficient approach, aim for static over dynamic where possible, and consider the impact of extensions and components."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Preconnect to required origins\n\n- Lighthouse audit: uses-rel-preconnect\n- WSG guideline: 18 Use the most efficient solution for your service\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#use-the-most-efficient-solution-for-your-service\n\n### Why this matters\nConsider adding `preconnect` or `dns-prefetch` resource hints to establish early connections to important third-party origins. [Learn how to preconnect to required origins](https://developer.chrome.com/docs/lighthouse/performance/uses-rel-preconnect/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "server-response-time",
          "title": "Initial server response time was short",
          "description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "4",
            "categoryName": "Hosting, Infrastructure, and Systems",
            "id": "11",
            "title": "Ensure infrastructure fits project requirements",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements",
            "subheading": "Maintain the infrastructure you require rather than over-provisioning. Autoscale to meet demand and preserve hardware resources."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Initial server response time was short\n\n- Lighthouse audit: server-response-time\n- WSG guideline: 11 Ensure infrastructure fits project requirements\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#ensure-infrastructure-fits-project-requirements\n\n### Why this matters\nKeep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "total-byte-weight",
          "title": "Avoids enormous network payloads",
          "description": "Large network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "5",
            "categoryName": "Business Strategy And Product Management",
            "id": "25",
            "title": "Define performance and environmental budgets",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets",
            "subheading": "Set budgets, taking people, planet, and performance into account alongside baselines, targets, evidence, and resources to help meet KPIs."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids enormous network payloads\n\n- Lighthouse audit: total-byte-weight\n- WSG guideline: 25 Define performance and environmental budgets\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#define-performance-and-environmental-budgets\n\n### Why this matters\nLarge network payloads cost users real money and are highly correlated with long load times. [Learn how to reduce payload sizes](https://developer.chrome.com/docs/lighthouse/performance/total-byte-weight/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        },
        {
          "auditId": "dom-size",
          "title": "Avoids an excessive DOM size",
          "description": "A large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).",
          "score": null,
          "displayValue": "",
          "impact": "investigate",
          "wsg": {
            "categoryId": "3",
            "categoryName": "Web Development",
            "id": "2",
            "title": "Remove unnecessary or redundant information",
            "url": "https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information",
            "subheading": "Remove redundant characters from code to reduce the amount of data being stored and transferred to devices."
          },
          "assessor": "script",
          "issueTemplate": "## Improve Avoids an excessive DOM size\n\n- Lighthouse audit: dom-size\n- WSG guideline: 2 Remove unnecessary or redundant information\n- WSG link: https://www.w3.org/TR/web-sustainability-guidelines/#remove-unnecessary-or-redundant-information\n\n### Why this matters\nA large DOM will increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn how to avoid an excessive DOM size](https://developer.chrome.com/docs/lighthouse/performance/dom-size/).\n\n### Definition of done\n- [ ] Metric improves in Lighthouse on key templates\n- [ ] Changes documented in release notes\n- [ ] Re-scan confirms improvement"
        }
      ]
    }
  ]
}
